可持久化Trie树
#include<bits/stdc++.h>
using namespace std;
const int maxn = 600009;
int cnt = 1 , sum[maxn * 28] , ch[maxn * 28][2] , qianzhui[maxn] , T[maxn] , n , m;
void change(int a ,int b , int t ,int x){
	if(t < 0)return ;
	int i = (x >> t) & 1;
	ch[a][!i] = ch[b][!i];//继承上一个全部的内容
	ch[a][i] = cnt ++;
	sum[ch[a][i]] = sum[ch[b][i]] + 1;
	change(ch[a][i] , ch[b][i] , t - 1 , x);
}
int query(int a ,int b ,int t ,int x){
	if(t < 0)return 0;
	int i = (x >> t) & 1;
	if(sum[ch[b][!i]] - sum[ch[a][!i]] > 0){
		return (1 << t) + query(ch[a][!i] , ch[b][!i] ,t - 1 ,x);
	}else{
		return query(ch[a][i] , ch[b][i] , t - 1 , x); 
	}
}
int main () {
  cin >> n >> m;
  T[0] = cnt ++; 
  change(T[0] , 0 , 25 , 0);
  for(int i = 1 ;i <= n ; i ++){
  	int x ;
  	scanf("%d" , &x);
  	qianzhui[i] = qianzhui[i - 1] ^ x;
  	T[i] = cnt ++;
  	change(T[i] , T[i - 1] , 25 , qianzhui[i]);
  }
  for(int i  = 1;i <= m ; i ++){
  	char o[5];
  	scanf("%s" , &o);
  	if(o[0] == 'A'){
  		int x; 
  		scanf("%d" , &x);
  		n ++;
  		qianzhui[n] = qianzhui[n - 1] ^ x;
  		T[n] = cnt ++;
  		change(T[n] , T[n - 1] , 25 , qianzhui[n]);
  		/*
  		关于在这里减不减1的话 , 如果我们是要在l - 1 到 r - 1 的话 , 需要减一
		下面l r 也需要减一 
  		*/
	  }else{
	  	int  l , r , x;
	  	scanf("%d%d%d" , &l , &r , &x);
	  	r -- ; 
	    if(l == 0){
	  	printf("%d\n" , query(0 , T[r] , 25 , x ^ qianzhui[n]));
		 }else{
		l --;
		printf("%d\n" , query(T[l - 1] , T[r] , 25 , x ^ qianzhui[n]));
	  }
	  }
  }
} 

                
            
        
浙公网安备 33010602011771号