给出 n 个数,及 m 个区间,问区间内每个数 a[i] ~ a[j] 中有几个不同的数
const int N=1e6+5;
int n,m,t;
int i,j,k;
int a[N];
int block,belong[N];
int ans[N],now=0;
int cnt[N];
struct node
{
int l,r;
int id;
}q[N];
bool cmp(node a,node b)
{
return belong[a.l]==belong[b.l]?a.r<b.r:belong[a.l]<belong[b.l];
}
void add(int x)
{
if(cnt[a[x]]==0) now++;
cnt[a[x]]++;
}
void del(int x)
{
cnt[a[x]]--;
if(cnt[a[x]]==0) now--;
}
int main()
{
//IOS;
while(sd(n)==1){
for(i=1;i<=n;i++) sd(a[i]);
block=sqrt(n);
int num=ceil(double(n/block));
for(i=1;i<=num;i++){
for(j=(i-1)*block+1;j<=i*block;j++){
belong[j]=i;
}
}
sd(m);
for(i=1;i<=m;i++) sdd(q[i].l,q[i].r),q[i].id=i;
sort(q+1,q+1+m,cmp);
int l=1,r=0;
for(i=1;i<=m;i++){
while(l<q[i].l) del(l++);
while(l>q[i].l) add(--l);
while(r<q[i].r) add(++r);
while(r>q[i].r) del(r--);
ans[q[i].id]=now;
}
for(i=1;i<=m;i++) pd(ans[i]);
}
//PAUSE;
}