求解!!!**
#include<bits/stdc++.h>
#define M 1000005
using namespace std;
int n,m,blocksize,l,r,cnt,ql,qr;
int a[M],sum[M],ans[M];
struct node{
int l,r,id,bi;
}range[M];
inline bool cmp(node a,node b){
return a.bi^b.bi?a.l<b.l:((a.bi&1)?a.r<b.r:a.r>b.r);
}
int main(){
scanf("%d",&n);
for(register int i=1;i<=n;++i){
scanf("%d",&a[i]);
}
scanf("%d",&m);
blocksize=sqrt(n);
for(register int i=1;i<=m;++i){
// scanf("%d%d",&l,&r);
// range[i]={l,r,i,(l-1)/blocksize+1};
scanf("%d%d",&range[i].l,&range[i].r);
range[i].id=i;
range[i].bi=(i-1)/blocksize;
}
sort(range+1,range+1+m,cmp);
l=0,r=0,cnt=0;
for(register int i=1;i<=m;++i){
ql=range[i].l,qr=range[i].r;
while(l<ql) if(--sum[a[l++]]==0) --cnt;
while(l>ql) if(++sum[a[--l]]==1) ++cnt;
while(r<qr) if(++sum[a[++r]]==1) ++cnt;
while(r>qr) if(--sum[a[r--]]==0) --cnt;
ans[range[i].id]=cnt;
}
for(register int i=1;i<=m;++i){
printf("%d\n",ans[i]);
}
return 0;
}
#include<bits/stdc++.h>
#define M 1000005
using namespace std;
int n,m,blocksize,l,r,cnt,ql,qr;
int a[M],sum[M],ans[M];
struct node{
int l,r,id,bi;
}range[M];
inline bool cmp(node a,node b){
return a.bi^b.bi?a.l<b.l:((a.bi&1)?a.r<b.r:a.r>b.r);
}
int main(){
scanf("%d",&n);
for(register int i=1;i<=n;++i){
scanf("%d",&a[i]);
}
scanf("%d",&m);
blocksize=sqrt(n);
for(register int i=1;i<=m;++i){
scanf("%d%d",&l,&r);
range[i]={l,r,i,(l-1)/blocksize+1};
// scanf("%d%d",&range[i].l,&range[i].r);
// range[i].id=i;
// range[i].bi=(i-1)/blocksize;
}
sort(range+1,range+1+m,cmp);
l=0,r=0,cnt=0;
for(register int i=1;i<=m;++i){
ql=range[i].l,qr=range[i].r;
while(l<ql) if(--sum[a[l++]]==0) --cnt;
while(l>ql) if(++sum[a[--l]]==1) ++cnt;
while(r<qr) if(++sum[a[++r]]==1) ++cnt;
while(r>qr) if(--sum[a[r--]]==0) --cnt;
ans[range[i].id]=cnt;
}
for(register int i=1;i<=m;++i){
printf("%d\n",ans[i]);
}
return 0;
}