这么写主席树为什么会T?
#include<bits/stdc++.h>
using namespace std;
int n,m,x,a[40000005][3],b[1000005],cnt=0,c[1000005],y;
int build(int l,int r)
{
int x=++cnt;
if (l<r)
{
int mid=l+r>>1;
a[x][1]=build(l,mid);
a[x][2]=build(mid+1,r);
}
return x;
}
int modify(int x,int bl,int br,int y,int z)
{
++cnt;
memcpy(a[cnt],a[x],sizeof(a[x]));
x=cnt;
if (bl==br)
a[x][0]=z;
else
{
int mid=bl+br>>1;
if (y<=mid)
a[x][1]=modify(a[x][1],bl,mid,y,z);
else
a[x][2]=modify(a[x][2],mid+1,br,y,z);
a[x][0]=a[a[x][1]][0]+a[a[x][2]][0];
}
return x;
}
int query(int x,int bl,int br,int l,int r)
{
if (bl==br)
return a[x][0];
int mid=bl+br>>1,result=0;
if (l<=mid)
result+=query(a[x][1],bl,mid,l,r);
if (mid<r)
result+=query(a[x][2],mid+1,br,l,r);
return result;
}
int main()
{
cin>>n;
build(1,n);
b[0]=1;
for (int i=1;i<=n;++i)
{
scanf("%d",&x);
if (c[x])
b[i]=modify(modify(b[i-1],1,n,i,1),1,n,c[x],0);
else
b[i]=modify(b[i-1],1,n,i,1);
c[x]=i;
}
cin>>m;
while (m--)
{
scanf("%d%d",&x,&y);
cout<<query(b[y],1,n,x,y)<<'\n';
}
}