analysis
莫队,绝对是裸的莫队
维护出c数组即可
要注意的是,在添加项的时候那个insert函数和delet函数的写法,这两个函数根据题意不同而不同
code
#include<bits/stdc++.h>
using namespace std;
#define loop(i,start,end) for(register int i=start;i<=end;++i)
#define anti_loop(i,start,end) for(register int i=start;i>=end;--i)
#define clean(arry,num) memset(arry,num,sizeof(arry))
#define max(a,b) ((a>b)?a:b)
#define min(a,b) ((a<b)?a:b)
#define ll long long
template<typename T>void read(T &x){
x=0;char r=getchar();T neg=1;
while(r>'9'||r<'0'){if(r=='-')neg=-1;r=getchar();}
while(r>='0'&&r<='9'){x=(x<<1)+(x<<3)+r-'0';r=getchar();}
x*=neg;
}
int n,m,k;
const int maxn=50000+10;
int c[maxn];
int a[maxn];
int block;
struct question{
int l;int r;int block;int order;
}Q[maxn];
int res[maxn];
inline bool cmp(question a,question b){
if(a.block==b.block){
if(a.block%2==1)return a.r<b.r;
else return a.r>b.r;
}
else return a.l<b.l;
}
inline void ins(int pos,int &_sigma){
_sigma+=2*c[a[pos]]+1;
++c[a[pos]];
}
inline void del(int pos,int &_sigma){
_sigma-=2*c[a[pos]]-1;
--c[a[pos]];
}
inline void mo(){
clean(c,0);
int l=1;int r=1;
++c[a[l]];
int sigma=c[a[l]]*c[a[l]];
loop(i,1,m){
while(l<Q[i].l)
del(l++,sigma);
while(l>Q[i].l)
ins(--l,sigma);
while(r>Q[i].r)
del(r--,sigma);
while(r<Q[i].r)
ins(++r,sigma);
res[Q[i].order]=sigma;
}
loop(i,1,m)printf("%d\n",res[i]);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("datain.txt","r",stdin);
#endif
read(n);read(m);read(k);
clean(res,0);clean(a,0);
block=sqrt(n);
loop(i,1,n){
read(a[i]);
}
loop(i,1,m){
read(Q[i].l);
read(Q[i].r);
Q[i].order=i;
Q[i].block=Q[i].l/block;//注意不要手残写错了!代价很大的
}
sort(Q+1,Q+1+m,cmp);
mo();
return 0;
}