除了#17以外全WA了,求助大佬
#include<iostream>
#include<cstring>
#include<cstdio>
#define lc tr[i].ch[0]
#define rc tr[i].ch[1]
#define mid (l+r)/2
#define lowbit(x) x&(-x)
using namespace std;
const int N=1e5;
const int B=32;
struct Basis{
int p[B+5];
void clear(){
memset(p,0,sizeof p);
}
void Insert(int x){
for(int i=B;~i;i--){
if(!(x>>i)){
continue;
}
if(!p[i]){
p[i]=x;
break;
}
x^=p[i];
}
}
void Merge(Basis One,Basis Other){
*this=One;
for(int i=B;~i;i--){
if(Other.p[i]){
Insert(Other.p[i]);
}
}
}
int getans(int x){
int res=x;
for(int i=B;~i;i--){
res=max(res,res^p[i]);
}
return res;
}
};
struct segNode{
int ch[2];
Basis basis;
};
int rt,cnt,a[N+5];
struct segTree{
segNode tr[4*N+5];
void pushup(int i){
tr[i].basis.Merge(tr[lc].basis,tr[rc].basis);
}
void build(int &i,int l,int r){
i=++cnt;
tr[i].basis.clear();
if(l==r){
tr[i].basis.Insert(a[l]^a[l-1]);
return;
}
build(lc,l,mid);
build(rc,mid+1,r);
pushup(i);
}
void update(int i,int l,int r,int x,int val){
if(l==r){
tr[i].basis.clear();
tr[i].basis.Insert(val);
return;
}
if(x<=mid){
update(lc,l,mid,x,val);
}else{
update(rc,mid+1,r,x,val);
}
pushup(i);
}
Basis query(int i,int l,int r,int L,int R){
if(L<=l&&R>=r){
return tr[i].basis;
}
Basis res;
if(L<=mid&&R>mid){
res.Merge(query(lc,l,mid,L,R),query(rc,mid+1,r,L,R));
return res;
}else if(R<=mid){
return query(lc,l,mid,L,R);
}else{
return query(rc,mid+1,r,L,R);
}
}
}seg;
int n,m;
struct bitTree{
int sub[N+5];
void add(int x,int k){
for(int i=x;i<=n+1;i+=lowbit(i)){
sub[i]^=k;
}
}
int getxor(int x){
int res=0;
for(int i=x;i;i-=lowbit(i)){
res^=sub[i];
}
return res;
}
}bit;
void update(int l,int r,int val){
bit.add(l,val);
bit.add(r+1,val);
seg.update(rt,1,n+1,l,bit.getxor(l)^bit.getxor(l-1));
seg.update(rt,1,n+1,r+1,bit.getxor(r+1)^bit.getxor(r));
}
int query(int l,int r,int val){
Basis res;
res.clear();
if(l<r){
res=seg.query(rt,1,n+1,l+1,r);
}
res.Insert(bit.getxor(l));
return res.getans(val);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
bit.add(i,a[i]^a[i-1]);
}
bit.add(n+1,a[n]);
seg.build(rt,1,n+1);
for(int i=1;i<=m;i++){
int type;
int l,r,val;
scanf("%d%d%d%d",&type,&l,&r,&val);
if(type==1){
update(l,r,val);
}else{
printf("%d\n",query(l,r,val));
}
}
return 0;
}