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; }
voidadd( int pos ){ int x = a[pos]; nowans -= cnt[x] * cnt[x]; ++ cnt[x]; nowans += cnt[x] * cnt[x]; }
voiddel( int pos ){ int x = a[pos]; nowans -= cnt[x] * cnt[x]; -- cnt[x]; nowans += cnt[x] * cnt[x]; }
voidsolve( ){ int n = read( ), m = read( ), k = 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 -- ); ans[idx] = nowans; }
for( int i = 1; i <= m; ++ i ) { cout << ans[i] << '\n'; } }