莫队求教
#include<bits/stdc++.h>
using namespace std;
int cnt [1000001];
int ans,l=1,r,m,n;
struct ttt{
int l,r,id;
}a[200001];
int b[30001],kuai[500],daan[30001];
void jian(int x){
cnt[b[x]]--;
if(cnt[b[x]]==0){
ans--;
}
}
void jia(int x){
if(cnt[b[x]]==0){
ans++;
}
cnt[b[x]]++;
}
void modui(int x,int y){
while(r<y){
r++;
jia(r);
}
while(r>y){
jian(r);
r--;
}
while(l<x){
jian(l);
l++;
}
while(l>x){
l--;
jia(l);
}
}
bool cmp(ttt a,ttt b){
return kuai[a.l]==kuai[b.l]?a.r<b.r:kuai[a.l]<kuai[b.l];
// return a.r<b.r
}
int main(){
cin>>m;
for(int i=1;i<=m;i++){
cin>>b[i];
}
cin>>n;
//fenkuai
for(int i=1;i<=ceil((double)sqrt(n));i++){
for(int j=1;j<=sqrt(n);j++){
int spfa=sqrt(n)*(i-1)+j;
kuai[spfa]=i;
}
}
for(int i=1;i<=n;i++){
cin>>a[i].l>>a[i].r;
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
modui(a[i].l,a[i].r);
daan[a[i].id]=ans;//printf("%d\n",ans);
}
for(int i=1;i<=n;i++){
printf("%d\n",daan[i]);
}
return 0;
}