哪位大佬帮我这位蒟蒻(菜鸟(小白))调调?
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000010],now=1,t[1000010],ans[1000010];
int tree[4000010];
struct node{
int k,l,r;
} st[1000010];
bool cmp(node a,node b){
return a.r<b.r;
}
void update(int l,int r,int rt,int a,int b){
if(l==r){
tree[rt]+=b;
return;
}
int mid=(l+r)>>1;
if(a<=mid) update(l,mid,rt<<1,a,b);
else update(mid+1,r,rt<<1|1,a,b);
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
return;
}
int query(int l,int r,int rt,int a,int b){
if(a<=l&&b>=r) return tree[rt];
int mid=(l+r)>>1,sum=0;
if(a<=mid) sum+=query(l,mid,rt<<1,a,b);
if(b>mid) sum+=query(mid+1,r,rt<<1|1,a,b);
return sum;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++){
st[i].k=i;
scanf("%d%d",&st[i].l,&st[i].r);
}
sort(st+1,st+m+1,cmp);
for(int i=1;i<=m;i++){
while(now<=st[i].r){
if(t[a[now]]) update(1,m,1,t[a[now]],-1);
update(1,m,1,i,1);
t[a[now]]=i;
now++;
}
ans[st[i].k]=query(1,m,1,st[i].l,st[i].r);
}
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}