rt,一般来说T是排序错了,但我也找不到问题,求大佬救蒟蒻
#include <bits/stdc++.h>
#define N 1000100
using namespace std;
struct shit {
int w,id;
} pp[N];
struct fuck {
int l,r;
int id,pos;
} que[N];
int n,q,nn,fl=0,fr=0,ans=0,cnt=0;
int p[N],ansk[N],sum[N];
bool cmp(fuck a,fuck b) {//pos为l所在的块
return (a.pos!=b.pos?a.pos<b.pos:a.r<b.r);
}
bool cnm(shit a,shit b) {
return a.w<b.w;
}
signed main() {
scanf("%d",&n);
nn=sqrt(n);//分块
for(int i=1; i<=n; ++i) {
scanf("%d",&pp[i].w);
pp[i].id=i;
}
sort(pp+1,pp+1+n,cnm);
pp[0].w=-1;
for(int i=1; i<=n; ++i) {//离散化
if(pp[i].w!=pp[i-1].w) p[pp[i].id]=++cnt;
else p[pp[i].id]=cnt;
sum[i]=0;
}
scanf("%d",&q);
for(int i=1; i<=q; ++i) scanf("%d%d",&que[i].l,&que[i].r),que[i].id=i,que[i].pos=(que[i].l+1)/nn+1;
sort(que+1,que+1+q,cmp);//询问排序
for(int i=1; i<=q; i++) {//莫队
while(fl>que[i].l)fl--,sum[p[fl]]++,ans+=(sum[p[fl]]==1?1:0);
while(fr<que[i].r)fr++,sum[p[fr]]++,ans+=(sum[p[fr]]==1?1:0);
while(fl<que[i].l)sum[p[fl]]--,ans-=(sum[p[fl]]==0?1:0),fl++;
while(fr>que[i].r)sum[p[fr]]--,ans-=(sum[p[fr]]==0?1:0),fr--;
ansk[que[i].id]=ans;
}
for(int i=1; i<=q; i++) printf("%d\n",ansk[i]);//输出
return 0;
}