int block; ll nowans; intget_block( int pos ){ return ( pos - 1 ) / block; }
boolcmp( Query x, Query y ){ int bx = get_block( x.l ), by = get_block( y.l ); if( bx != by ) return bx < by; if( bx & 1 ) return x.r < y.r; return x.r > y.r; }
ll nC2( ll n ){ return n * ( n - 1 ) / 2; }
voidadd( int pos ){ int x = a[pos]; nowans -= nC2( cnt[x] ); cnt[x] ++; nowans += nC2( cnt[x] ); }
voiddel( int pos ){ int x = a[pos]; nowans -= nC2( cnt[x] ); cnt[x] --; nowans += nC2( cnt[x] ); }
voidsolve( ){ int n = read( ), m = read( ); block = sqrt( n ); nowans = 0;
for( int i = 1; i <= n; ++ i ) a[i] = read( ); for( int i = 1; i <= m; ++ i ) { qs[i].l = read( ), qs[i].r = read( ); qs[i].idx = i; }
sort( qs + 1, qs + m + 1, cmp ); int L = 1, R = 0;
for( int i = 1; i <= m; ++ i ) { auto [l, r, idx] = qs[i]; while( L > l ) add( -- L ); while( R < r ) add( ++ R ); while( L < l ) del( L ++ ); while( R > r ) del( R -- );
int len = r - l + 1; if( len == 1 ) { ans[idx] = { 0, 1 }; } else { ans[idx] = { nowans, nC2( len ) }; ans[idx].reduce( ); } }
for( int i = 1; i <= m; ++ i ) { cout << ans[i].p << '/' << ans[i].q << '\n'; } }