https://www.luogu.org/problem/show?pid=2709#sub
莫队经典题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,k,sum=0;
int num[50009],a[50009],ans[50009];
struct H{
int qv,id,l,r;
}Q[50009];
int my_comp(const H&a,const H&b)
{
if(a.qv!=b.qv)
return a.qv<b.qv?1:0;
return a.r<b.r?1:0;
}
void del(int x)
{
num[x]--;
if(x<=k&&x>=1)
sum=sum-(num[x]+1)*(num[x]+1)+(num[x])*(num[x]);
}
void add(int x)
{
num[x]++;
if(x<=k&&x>=1)
sum=sum-(num[x]-1)*(num[x]-1)+(num[x])*(num[x]);
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
int limit=(int)(sqrt((double)(n)+0.5));
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&Q[i].l,&Q[i].r);
Q[i].id=i,Q[i].qv=Q[i].l/limit;
}
sort(Q+1,Q+m+1,my_comp);
int l=0,r=0;
for(int i=1;i<=m;i++)
{
while(r>Q[i].r){
r--;
del(a[r+1]);
}
while(r<Q[i].r){
r++;
add(a[r]);
}
while(l<Q[i].l){
l++;
del(a[l-1]);
}
while(l>Q[i].l){
l--;
add(a[l]);
}
ans[Q[i].id]=sum;
}
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
return 0;
}