rt
用的是 zak 今天上午讲的方法,但是不知道是哪里写假了要跑 6s。
如果是我上课没听懂欢迎来骂我。
#include<bits/stdc++.h>
#define lc (mid<<1)
#define rc (mid<<1|1)
//#define int long long
using namespace std;
char buf[1000005],*p1,*p2;
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin))?EOF:*p1++)
int read(){
int x=0,c=gc();
while(!isdigit(c))c=gc();
while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=gc();
return x;
}
int n,q,a[50005];
mt19937 Rand(time(0));
struct ST{
struct Node{
int l,r;
int p,val;
bool sum;
}c[100005];
void Build(int q,int l,int r){
c[q].l=l;c[q].r=r;
c[q].p=0;
if(l==r){
c[q].sum=Rand()%2;
c[q].val=a[l]*c[q].sum;
return;
}
int mid=l+r>>1;
Build(lc,l,mid);
Build(rc,mid+1,r);
c[q].sum=c[lc].sum^c[rc].sum;
c[q].val=c[lc].val^c[rc].val;
}
void xr(int q,int x){
c[q].p^=x;
if(c[q].sum&1)c[q].val^=x;
}
void down(int q){
if(c[q].p){
int mid=c[q].l+c[q].r>>1;
xr(lc,c[q].p);
xr(rc,c[q].p);
c[q].p=0;
}
}
void Xor(int q,int l,int r,int x){
if(l<=c[q].l&&c[q].r<=r){
xr(q,x);
return;
}
down(q);
int mid=c[q].l+c[q].r>>1;
if(l<=mid)Xor(lc,l,r,x);
if(mid<r)Xor(rc,l,r,x);
c[q].val=c[lc].val^c[rc].val;
}
int Get(int q,int l,int r){
if(l<=c[q].l&&c[q].r<=r)return c[q].val;
down(q);
int mid=c[q].l+c[q].r>>1,res=0;
if(l<=mid)res^=Get(lc,l,r);
if(mid<r)res^=Get(rc,l,r);
return res;
}
}T[65];
int base[35];
void Insert(int x){
for(int i=30;i>=0;i--){
if(x>>i&1){
if(!base[i]){
base[i]=x;
return;
}
x^=base[i];
}
}
}
int Get(int x){
int res=x;
for(int i=30;i>=0;i--){
if(base[i]&&!(res>>i&1))res^=base[i];
}
return res;
}
signed main()
{
// freopen("data.in","r",stdin);
// freopen("data.out","w",stdout);
n=read(),q=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=50;i++)T[i].Build(1,1,n);
while(q--){
int op,l,r,x;
op=read(),l=read(),r=read(),x=read();
if(op==1){
for(int i=1;i<=60;i++)T[i].Xor(1,l,r,x);
}
else{
for(int i=0;i<=30;i++)base[i]=0;
for(int i=1;i<=60;i++)Insert(T[i].Get(1,l,r));
printf("%d\n",Get(x));
}
}
return 0;
}