洛谷 P3293 [SCOI2016]美味(主席树)
作者:互联网
const int N=2e5+5;
int n,m;
int i,j,k;
int a[N];
struct Node
{
int l,r;
int sz;
}t[N<<5];
int root[N],tot=0;
void update(int &x,int y,int l,int r,int pos)
{
x=++tot;
t[x]=t[y];
t[x].sz++;
if(l==r) return ;
else{
int mid=l+r>>1;
if(mid>=pos) update(t[x].l,t[y].l,l,mid,pos);
else update(t[x].r,t[y].r,mid+1,r,pos);
}
}
int query(int x,int y,int L,int R,int l,int r)
{
if(l>R || L>r) return 0;
if(L>=l && r>=R) return t[y].sz-t[x].sz;
else{
int mid=L+R>>1;
int ans=0;
if(mid>=l) ans+=query(t[x].l,t[y].l,L,mid,l,r);
if(r>=mid+1) ans+=query(t[x].r,t[y].r,mid+1,R,l,r);
return ans;
}
}
int main()
{
while(~sdd(n,m)){
for(int i=1;i<=n;i++) sd(a[i]);
for(int i=1;i<=n;i++) update(root[i],root[i-1],0,1e5,a[i]);
for(int i=1;i<=m;i++){
int b,x,l,r;
sdd(b,x); sdd(l,r);
int ans=0;
for(int j=20;j>=0;j--){
int id=(1<<j)&b?1:0;
//dbg(ans-x);
//dbg(ans+(1<<j)-1-x);
if(id && !query(root[l-1],root[r],0,1e5,ans-x,ans+(1<<j)-1-x)) //1找0
ans+=(1<<j);
if(!id && query(root[l-1],root[r],0,1e5,ans+(1<<j)-x,ans+(1<<j+1)-1-x))
ans+=(1<<j);
}
pd(ans^b);
}
}
//PAUSE;
return 0;
}
标签:洛谷,int,mid,P3293,pos,return,query,ans,SCOI2016 来源: https://blog.csdn.net/C_Dreamy/article/details/116136362