1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include <bits/stdc++.h> using namespace std; const int MAXN=50010; struct LB { int c[32]; LB () {memset(c,0,sizeof(c));} void insert (int x) { for (int i=30;i>=0;i--) { if (x&(1<<i)) { if (c[i]) {x^=c[i];} else {c[i]=x;return;} } } return; } int gtmx (int x) { for (int i=30;i>=0;i--) { if ((x^c[i])>x) {x^=c[i];} } return x; } }seg[MAXN*4]; LB merge (LB a,LB b) { for (int i=0;i<=30;i++) { if (b.c[i]) {a.insert(b.c[i]);} } return a; } int n,m,op,x,y,z,a[MAXN],b[MAXN],fw[MAXN]; void modify_fw (int x,int v) { for (int i=x;i<=n;i+=(i&(-i))) {fw[i]^=v;} return; } int query_fw (int x) { int res=0; for (int i=x;i;i-=(i&(-i))) {res^=fw[i];} return res; } void buildt (int p,int l,int r) { if (l==r) {seg[p].insert(b[l]);return;} int mid=(l+r)>>1; buildt(p<<1,l,mid),buildt((p<<1)|1,mid+1,r); seg[p]=merge(seg[p<<1],seg[(p<<1)|1]); return; } void modify (int p,int l,int r,int pos,int v) { if (l==r) { b[l]^=v; seg[p]=LB(); seg[p].insert(b[l]); return; } int mid=(l+r)>>1; if (pos<=mid) {modify(p<<1,l,mid,pos,v);} else {modify((p<<1)|1,mid+1,r,pos,v);} seg[p]=merge(seg[p<<1],seg[(p<<1)|1]); return; } LB query (int p,int l,int r,int xl,int xr) { if (xr<l||r<xl) {return LB();} if (xl<=l&&r<=xr) {return seg[p];} int mid=(l+r)>>1; return merge(query(p<<1,l,mid,xl,xr),query((p<<1)|1,mid+1,r,xl,xr)); } int main () { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); modify_fw(i,b[i]=(a[i]^a[i-1])); } buildt(1,1,n); for (int i=1;i<=m;i++) { scanf("%d%d%d%d",&op,&x,&y,&z); if (op==1) { modify(1,1,n,x,z); if (y<n) {modify(1,1,n,y+1,z);} modify_fw(x,z); if (y<n) {modify_fw(y+1,z);} } else { int tmp=query_fw(x); LB res=query(1,1,n,x+1,y); res.insert(tmp); printf("%d\n",res.gtmx(z)); } } return 0; }
|