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
| // 递归版 const int N=600010, len=23; int n, m, s[N]; int ch[N*25][2], ver[N*25]; int root[N], idx;
void insert(int x,int y,int i,int k){ ver[x] = i; if(k < 0) return; int c = s[i]>>k&1; ch[x][!c] = ch[y][!c]; ch[x][c] = ++idx; insert(ch[x][c],ch[y][c],i,k-1); } int query(int x,int L,int v,int k){ if(k < 0) return 0; int c = v>>k&1; if(ver[ch[x][!c]]>=L) return (1<<k)+query(ch[x][!c],L,v,k-1); else return query(ch[x][c],L,v,k-1); } int main(){ int l,r,x,ans; char op; scanf("%d%d",&n,&m); ver[0] = -1; root[0] = ++idx; insert(root[0],0,0,len); for(int i=1; i <= n; i++){ scanf("%d", &x); root[i] = ++idx; s[i] = s[i-1]^x; insert(root[i],root[i-1],i,len); } while(m--){ scanf(" %c",&op); if(op == 'A'){ scanf("%d",&x); root[++n] = ++idx; s[n] = s[n-1]^x; insert(root[n],root[n-1],n,len); } else{ scanf("%d%d%d",&l,&r,&x); ans=query(root[r-1],l-1,s[n]^x,len); printf("%d\n", ans); } } return 0; }
|