https://www.lydsy.com/JudgeOnline/problem.php?id=1878
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int read()
{
int f=1,x=0;
char ss=getchar();
while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}
while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}
return x*f;
}
int t,n,m;
int L=1,R=0;
int cnt[1000010],a[500010];
struct node
{
int l,r,id;
};
node q[200010];
bool cmp(node a,node b)
{
if(a.l/t==b.l/t)//属于同一块
return a.r<b.r;
return a.l/t<b.l/t;
}
int ans[200010],sum;
void add(int x)
{
cnt[x]++;
if(cnt[x]==1)
sum++;
}
void del(int x)
{
cnt[x]--;
if(cnt[x]==0)//此数没了
sum--;
}
int main()
{
int i;
n=read();
for(i=1;i<=n;i++)
a[i]=read();
m=read();
for(i=1;i<=m;i++)
{
q[i].l=read();
q[i].r=read();
q[i].id=i;
}
t=sqrt(n);//块数
sort(q+1,q+1+m,cmp);
sum=0;
for(i=1;i<=m;i++)
{
while(R<q[i].r)
{
R++;
add(a[R]);
}
while(R>q[i].r)
{
del(a[R]);
R--;
}
while(L<q[i].l)
{
del(a[L]);
L++;
}
while(L>q[i].l)
{
L--;
add(a[L]);
}
ans[q[i].id]=sum;
}
for(i=1;i<=m;i++)
printf("%d\n",ans[i]);
}