题链:https://vjudge.net/problem/CodeForces-86D
思路:与luogu P2709 小B的询问一个题,只不过加了乘s。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5+10;
const int M = 1e6+10;
int n,t,a[N],belong[N],base;
struct node{
int l,r,id;
}q[N];
int num[M];
ll ans[N],sum=0;
bool cmp(node a,node b){
return (belong[a.l]^belong[b.l])?belong[a.l]<belong[b.l]:(belong[a.l]&1)?a.r<b.r:a.r>b.r;
}
void add(int x){
sum+=(num[a[x]]<<1|1)*a[x];
++num[a[x]];
}
void del(int x){
--num[a[x]];
sum-=(num[a[x]]<<1|1)*a[x];
}
int main(void){
scanf("%d%d",&n,&t);
base=ceil(sqrt(1.0*n));
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),belong[i]= i/base;
for(int i=1;i<=t;i++)
scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
sort(q+1,q+1+t,cmp);
int l=1,r=0;
for(int i=1;i<=t;i++){
int ql=q[i].l,qr=q[i].r;
while(l<ql) del(l++);
while(l>ql) add(--l);
while(r<qr) add(++r);
while(r>qr) del(r--);
ans[q[i].id]=sum;
}
for(int i=1;i<=t;i++)
printf("%I64d\n",ans[i]);
return 0;
}