请求调试
查看原帖
请求调试
40713
zeromclai楼主2023/4/21 20:34
#include<bits/stdc++.h>
#define f(i,x,y) for(int i=(x); i<=(y); i++)
#define fl(i,x,y) for(int i=(x); i<(y); i++)
#define fb(i,x,y) for(int i=(y); i>=(x); i--) 
using namespace std;
const int N=600005;
const int debug=0;
int n,m,a[N],tot,b[N],rt[N],sum[N];
struct Node{
	int l,r,maxx;
}tree[N*25];
void Get(int x){
	f(i,0,20+debug)
		if(x&(1<<(20+debug-i)))b[i+1]=1;
		else b[i+1]=0;
}
void Build(int &x){x=++tot;tree[x].l=0;tree[x].r=0;}
void add(int &x,int X,int I,int T){
	if(I>22+debug)return ;
	Build(x);tree[x]=tree[X];tree[x].maxx=T;
	if(b[I]==1) add(tree[x].r,tree[X].r,I+1,T);
	else add(tree[x].l,tree[X].l,I+1,T);
//	printf("(%d,%d,%d)\n",x,tree[x].l,tree[x].r);
}
int query(int x,int Low,int I){
	if(I>22+debug)return 0;
//	printf("(%d,%d,%d,%d)\n",x,tree[x].l,tree[x].r,tree[x].maxx);
	if(b[I]==0){
		if(tree[x].r&&tree[tree[x].r].maxx>=Low)
			return (1<<(21+debug-I))+query(tree[x].r,Low,I+1);
		else if(tree[x].l&&tree[tree[x].l].maxx>=Low)
			return query(tree[x].l,Low,I+1);
	}	
	else{
		if(tree[x].l&&tree[tree[x].l].maxx>=Low)
			return (1<<(21+debug-I))+query(tree[x].l,Low,I+1);
		else if(tree[x].r&&tree[tree[x].r].maxx>=Low)
			return query(tree[x].r,Low,I+1);
	}
}
char ch[2];
int Copy,XX,YY,ZZ;
int main(){
	scanf("%d%d",&n,&m);rt[0]=1;
	f(i,1,n){
		scanf("%d",&Copy);sum[i]=sum[i-1]^Copy;
		Get(sum[i]);
		add(rt[i],rt[i-1],1,i);
//		printf("\n");
	}
	while(m--){
		scanf("%s",ch);
		if(ch[0]=='A'){
			scanf("%d",&XX);n++;sum[n]=sum[n-1]^XX;
			Get(sum[n]);
			add(rt[n],rt[n-1],1,n);
		}
		else if(ch[0]=='Q'){
			scanf("%d%d%d",&XX,&YY,&ZZ);
			ZZ=ZZ^sum[n];Get(ZZ);
			printf("%d\n",query(rt[YY-1],XX-1,1));
		}
	}
    return 0;
}

不知道哪里WA了,请求帮忙调试

2023/4/21 20:34
加载中...