RT,样例完全没问题,但就是WA了
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000005],cnt[1000005],block,num[1000005],ans[1000005],l=1,r,sum;
struct node {
int l,r,p;
} q[1000005];
bool cmp(node a,node b) {
if(num[a.l]!=num[b.l])return num[a.l]<num[b.l];
return a.r<b.r;
}
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++)scanf("%d",&a[i]);
block=sqrt(n);
for(int i=1; i<=n; i++)num[i]=(i/block)+(i%block!=0);
scanf("%d",&m);
for(int i=1; i<=m; i++) {
scanf("%d%d",&q[i].l,&q[i].r);
q[i].p=i;
}
sort(q+1,q+m+1,cmp);
for(int i=1; i<=m; i++) {
int nl=q[i].l,nr=q[i].r;
while(l<nl) {
if(cnt[a[l]]==1)sum--;
cnt[a[l]]--;
l++;
}
while(r<nr) {
r++;
if(!cnt[a[r]])sum++;
cnt[a[r]]++;
}
while(l>nl) {
l--;
if(!cnt[a[l]])sum--;
cnt[a[l]]++;
}
while(r>nr) {
if(cnt[a[r]]==1)sum--;
cnt[a[r]]--;
r--;
}
ans[q[i].p]=sum;
/*printf("%d %d %d\n",nl,nr,sum);
for(int i=1; i<=5; i++)printf("%d ",cnt[i]);
puts("");*/
}
for(int i=1; i<=m; i++)printf("%d\n",ans[i]);
}