求调主席树MLE
查看原帖
求调主席树MLE
491532
艾德加楼主2022/11/8 17:35
#include<bits/stdc++.h>
#define NN 200005
using namespace std;
int n,m,b,x,l,r,a[200005],tr[NN<<7],lson[NN<<7],rson[NN<<7],sum[NN<<7];
const int N=3e5+3;
int cnt=0;
int build(int l,int r){
	int rt=++cnt;
	if(l==r) return rt;
	else{
		int mid=(l+r)>>1;
		lson[rt]=build(l,mid);
		rson[rt]=build(mid+1,r);
		return rt;
	}
}
int upd(int pre,int l,int r,int x){
	int rt=++cnt;
	if(l==r){
		sum[rt]++;
		return rt;
	}
	else{
		int mid=(l+r)>>1;
		lson[rt]=lson[pre];
		rson[rt]=rson[pre];
		sum[rt]=sum[pre];
		if(x<=mid) lson[rt]=upd(lson[pre],l,mid,x);
		else rson[rt]=upd(rson[pre],mid+1,r,x);
		sum[rt]=sum[lson[rt]]+sum[rson[rt]];
		return rt;
	}
}
int find(int root,int l,int r,int ql,int qr){
	if(l>=ql&&r<=qr) return sum[root];
	else{
		int mid=(l+r)>>1;
		int su=0;
		if(mid>=ql) su+=find(lson[root],l,mid,ql,qr);
		if(mid<qr) su+=find(rson[root],mid+1,r,ql,qr);
		return su;
	}
}
int main(){
	cin>>n>>m;
	tr[0]=build(0,N);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		tr[i]=upd(tr[i-1],0,N,a[i]);		
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d%d%d",&b,&x,&l,&r);
		int ans=0;
		for(int j=17;j>=0;j--){
			int down,up,ff=0,fff=0;
			down=ans-x,up=ans+(1<<j)-1-x;
			if(find(tr[r],0,N,down,up)-find(tr[l-1],0,N,down,up)>0) ff=1;
			down=ans+(1<<j)-x,up=ans+(1<<(j+1))-1-x;
			if(find(tr[r],0,N,down,up)-find(tr[l-1],0,N,down,up)>0) fff=1;
			if(b&(1<<j)){
				if(ff==1) ans+=0;
				else if(fff==1) ans+=(1<<j);
			}
			else{
				if(fff==1) ans+=(1<<j);
				else if(ff==1) ans+=0;
			}
		}
		printf("%d\n",ans^b);
	}
}
2022/11/8 17:35
加载中...