实在调不出来,救救孩子...
#include<iostream>
using namespace std;
const int N=1e6+5,M=1e6;
int a[N],before[N];
int root[N],idx;
int read(){
char x;
while((x = getchar()) > '9' || x < '0') ;
int u = x - '0';
while((x = getchar()) <= '9' && x >= '0') u = (u << 3) + (u << 1) + x - '0';
return u;
}
struct node{
int l,r;
int sum;
}tr[N*50];
void pushup(int u){
tr[u].sum=tr[tr[u].l].sum+tr[tr[u].r].sum;
}
void insert(int p,int &q,int l,int r,int c,int x){
q=++idx;
tr[q]=tr[p];
if(l==r){
tr[q].sum=c;
return;
}
int mid=l+r>>1;
if(x<=mid) insert(tr[p].l,tr[q].l,l,mid,c,x);
else insert(tr[p].r,tr[q].r,mid+1,r,c,x);
pushup(q);
}
int ask(int p,int l,int r,int trL,int trR){
if(trL>=l&&trR<=r){
return tr[p].sum;
}
int mid=trL+trR>>1;
int res=0;
if(l<=mid) res+=ask(tr[p].l,l,r,trL,mid);
if(r>mid) res+=ask(tr[p].r,l,r,mid+1,trR);
return res;
}
int main(){
int n,m;
n=read();
for(int i=1;i<=n;++i){
a[i]=read();
if(!before[a[i]]){
insert(root[i-1],root[i],1,M,1,i);
}
else{
int t;
insert(root[i-1],t,1,M,0,before[a[i]]);
insert(t,root[i],1,M,1,i);
}
before[a[i]]=i;
}
m=read();
while(m--){
int l,r;
l=read();r=read();
printf("%d\n",ask(root[r],l,r,1,M));
}
return 0;
}