可过样例
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std ;
int N , a[200005] , cnt[200005] , belong[200005] , siz , ans[200005] , m ;
struct query{
int l ;
int r ;
int id ;
};
query q[200005] ;
bool cmp(query a , query b ){
return belong[a.id] == belong[b.id] ? a.r < b.r : a.l < b.l ;
}
signed main(){
scanf("%lld%lld" , &N , &m );
for( int i = 1 ; i <= N ; ++ i ){
scanf("%lld" , &a[i] );
}
siz = sqrt(N);
for( int i = 1 ; i <= m ; ++ i ){
scanf("%lld%lld" , &q[i].l , &q[i].r );
q[i].id = i ;
belong[i] = ceil(q[i].l/siz);
}
sort(q+1 , q+m+1 , cmp );
int l = 1 ;
int r = 0 ;
int an = 0;
for( int i = 1 ; i <= m ; ++ i ){
int ql = q[i].l ;
int qr = q[i].r ;
while( l > ql ) cnt[a[-- l]] ++ , an += ( cnt[a[l]] * 2 - 1 )*a[l];
while( r < qr ) cnt[a[++ r]] ++ , an += ( cnt[a[r]] * 2 - 1 )*a[r];
while( l < ql ) cnt[a[l]] -- , an -=(cnt[a[l++]] * 2 + 1)*a[l] ;
while( r > qr ) cnt[a[r]] -- , an -=(cnt[a[r--]] * 2 + 1)*a[r] ;
ans[q[i].id] = an ;
}
for( int i = 1 ; i <= m ; ++ i ){
printf("%lld\n",ans[i]);
}
return 0 ;
}
test3:
20 8
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
4 15
1 2
2 20
7 7
13 18
7 7
3 19
3 8
正确输出:
108
3
281
1
27
1
209
27
感谢大佬!好人一生平安!