莫队可做吗,T了两个点
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
struct qwe{
int x,y,id;
}q[2000010];
int n,c,m;
int a[2000010],t[2000010];
int sum,ans[2000010];
int g;
bool cmp(qwe x,qwe y)
{
if(x.y/g==y.y/g)return x.x<y.x;
return x.y<y.y;
}
int l=1,r,ql,qr;
void q1(int x)
{
t[a[x]]++;
if(t[a[x]]==2)sum++;
}
void q2(int x)
{
t[a[x]]--;
if(t[a[x]]==1)sum--;
}
int main()
{
scanf("%d%d%d",&n,&c,&m);
g=sqrt(n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&q[i].x,&q[i].y);
q[i].id=i;
}
sort(q+1,q+1+m,cmp);
//for(int i=1;i<=m;i++)cout<<q[i].x<<" "<<q[i].y<<endl;
for(int i=1;i<=m;i++)
{
ql=q[i].x,qr=q[i].y;
while(l>ql)q1(--l);
while(l<ql)q2(l++);
while(r>qr)q2(r--);
while(r<qr)q1(++r);
ans[q[i].id]=sum;
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
}