2709 小B的询问
莫队板子但我RE了
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int siz,ans;
int a[500005];
int be[500005];
int num[500005];
struct haha
{
int l,r,id,ans;
}ha[500005];
bool cmp1(haha x,haha y)
{
if(be[x.l]==be[y.l])
return x.r<y.r;
return be[x.l]<be[y.l];
}
bool cmp2(haha x,haha y)
{
return x.id<y.id;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
siz=sqrt(n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
be[i]=(i-1)/siz+1;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&ha[i].l,&ha[i].r);
ha[i].id=i;
}
sort(ha+1,ha+m+1,cmp1);
int L=1,R=0;
for(int i=1;i<=m;i++)
{
while(L<ha[i].l)
{
ans-=num[a[L]]*num[a[L]];
num[a[L]]--;
ans+=num[a[L]]*num[a[L]];
L++;
}
while(L>ha[i].l)
{
L++;
ans-=num[a[L]]*num[a[L]];
num[a[L]]++;
ans+=num[a[L]]*num[a[L]];
}
while(R>ha[i].r)
{
ans-=num[a[R]]*num[a[R]];
num[a[R]]--;
ans+=num[a[R]]*num[a[R]];
R--;
}
while(R<ha[i].r)
{
R++;
ans-=num[a[R]]*num[a[R]];
num[a[R]]++;
ans+=num[a[R]]*num[a[R]];
}
ha[i].ans=ans;
}
sort(ha+1,ha+m+1,cmp2);
for(int i=1;i<=m;i++)
printf("%d\n",ha[i].ans);
return 0;
}