我觉得出题人应该想的是主席树,树状数组什么玩意把,莫队做的话水的要死
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define maxn 200020
using namespace std;
int n,m,a[maxn],block,ans[maxn],pos[50010];
void read(int& x){
x=0;char c=getchar();int flag=1;
for(;c>'9'||c<'0';c=getchar())if(c=='-')flag=-1;
for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';
x*=flag;
}
struct question{
int l,r,id;
bool operator<(const question& b)const{
if(pos[l]==pos[b.l])return r<b.r;
return pos[l] < pos[b.l];
}
}nod[maxn];
int vis[1000020],much;
void add(int x){
if(!vis[x])much++,vis[x]++;
else vis[x]++;
}
void del(int x){
vis[x]--;
if(vis[x]==0)much--;
}
int main(){
read(n);block=sqrt(n);
for(int i=1;i<=n;i++)read(a[i]),pos[i]=(i-1)/block+1;
int l=0,r=0;read(m);
for(int i=1;i<=m;i++)read(nod[i].l),read(nod[i].r),nod[i].id=i;
sort(nod+1,nod+1+m);
for(int i=1;i<=m;i++){
while(r<nod[i].r)r++,add(a[r]);
while(l<nod[i].l)del(a[l]),l++;
while(l>nod[i].l)l--,add(a[l]);
while(r>nod[i].r)del(a[r]),r--;
ans[nod[i].id]=much;
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
return 0;
}