题解 P2709 【小B的询问】
不要问我变量名是什么
这本来就是半个双倍经验题啊
xs
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,col[50010],ans,L=1,R,s[50010],FK[50010],GG;
struct node
{
ll l;//左
ll r;//右
ll place;//原位置
ll ANS;
}Q[50010];//question
ll update(ll x,ll fh)
{
s[col[x]]+=fh;
ans+=fh*(2*s[col[x]])-1;
}
int cmp(node a,node b)
{
if(FK[a.l]!=FK[b.l])
return a.l<b.l;
return a.r<b.r;
}
int Cmp(node a,node b)
{
return a.place<b.place;
}
int main()
{
cin>>n>>m>>GG;
for(int i=1;i<=n;i++)
{
cin>>col[i];
}
int fk=sqrt(n);
for(int i=1;i<=m;i++)
{
cin>>Q[i].l>>Q[i].r;
Q[i].place=i;
}
for(int i=1;i<=n;i++)
{
FK[i]=(i-1)/fk+1;
}
sort(Q+1,Q+m+1,cmp);
for(int i=1;i<=m;i++)
{
for(;R<Q[i].r;R++)
{
update(R+1,1);
}
for(;R>Q[i].r;R--)
{
update(R,-1);
}
for(;L<Q[i].l;L++)
{
update(L,-1);
}
for(;L>Q[i].l;L--)
{
update(L-1,1);
}
Q[i].ANS=ans;
}
sort(Q+1,Q+m+1,Cmp);
for(int i=1;i<=m;i++)
{
cout<<Q[i].ANS<<endl;
}
}