rt
全 WA,思路与 link 同
#include <iostream>
#include <cstdio>
#define N 50001
using namespace std;
int n,m,a[N];
struct Tree { int sum,ans,bs[30]; }res,t[N<<2];
void ins(Tree &x,int val) {
for (int i=29;i>=0 and val;i--)
if ((val>>i)&1) {
val^=x.bs[i];
if (!x.bs[i]) { x.bs[i]=val; break; }
}
}
void getans(Tree &x,int v) {
x.ans=v;
for (int i=29;i>=0;i--) x.ans=max(x.ans,x.ans^x.bs[i]);
}
void upd(int x,int l,int r,int pos,int val) {
if (pos>r) return;
if (l==r) {
for (int i=29;i>=0;i--) t[x].bs[i]=0;
return ins(t[x],t[x].sum^=val);
}
int mid=(l+r>>1);
if (pos<=mid) upd(x<<1,l,mid,pos,val);
else upd(x<<1|1,mid+1,r,pos,val);
t[x].sum=t[x<<1].sum^t[x<<1|1].sum;
for (int i=29;i>=0;i--) ins(t[x],t[x<<1].bs[i]),ins(t[x],t[x<<1|1].bs[i]);
}
void ask(int x,int l,int r,int L,int R) {
if (L>R) return;
if (L<=l and r<=R) {
for (int i=29;i>=0;i--) ins(res,t[x].bs[i]);
return;
}
int mid=(l+r>>1);
if (L<=mid) ask(x<<1,l,mid,L,R);
if (R>mid) ask(x<<1|1,mid+1,r,L,R);
}
int ask0(int x,int l,int r,int L,int R) {
if (L<=l and r<=R) return t[x].sum;
int mid=(l+r>>1),res=0;
if (L<=mid) res^=ask0(x<<1,l,mid,L,R);
if (R>mid) res^=ask0(x<<1|1,mid+1,r,L,R);
return res;
}
int main() {
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%d",a+i);
for (int i=n;i;i--) a[i]=a[i]^a[i-1],upd(1,1,n,i,a[i]);
for (int i=1,op,l,r,v;i<=m;i++) {
scanf("%d%d%d%d",&op,&l,&r,&v);
if (op==1) upd(1,1,n,l,v),upd(1,1,n,r+1,v);
else {
res.ans=0; for (int j=29;j>=0;j--) res.bs[j]=0;
int tmp=ask0(1,1,n,1,l);
ask(1,1,n,l+1,r); ins(res,tmp); getans(res,v);
printf("%d\n",res.ans);
}
}
return 0;
}