#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define lc p << 1
#define rc p << 1 | 1
#define lowbit(x) x & -x
#define inv(x) qmi(x, P - 2)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;
const int N = 6e5 + 10, M = 2 * N;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f;
const double PI = 3.141592653589793;
const int dx[] = {-1, 0, 1, 1, 1, 0, -1, -1}, dy[] = {1, 1, 1, 0, -1, -1, -1, 0};
const int P = 998244353;
int T = 1;
ll qmi(ll a, ll b){
ll res = 1;
while(b){
if(b & 1) res = res * a % P;
b >>= 1;
a = a * a % P;
}
return res;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
int tr[N * 25][2];
int max_id[N * 25], root[N], s[N], idx;
void solve(){
int n, m;
cin >> n >> m;
function<void(int, int, int, int)> insert = [&](int i, int k, int p, int q) -> void{
if(k < 0){
max_id[q] = i;
return;
}
int v = s[i] >> k & 1;
if(p) tr[q][v ^ 1] = tr[p][v ^ 1];
tr[q][v] = ++ idx;
insert(i, k - 1, tr[p][v], tr[q][v]);
max_id[q] = max(max_id[tr[q][0]], max_id[tr[q][1]]);
};
function<int(int, int, int)> qurry = [&](int root, int c, int l) -> int{
int p = root;
for(int i = 23; i >= 0; i --){
int v = c >> i & 1;
if(max_id[tr[p][v ^ 1]] >= l) p = tr[p][v ^ 1];
else p = tr[p][v];
}
return c ^ s[max_id[p]];
};
max_id[0] = -1;
root[0] = ++ idx;
insert(0, 23, 0, root[0]);
for(int i = 1; i <= n; i ++){
int x;
cin >> x;
s[i] = s[i - 1] ^ x;
root[i] = ++ idx;
insert(i, 23, root[i - 1], root[i]);
}
while(m --){
char op;
int l, r, c;
cin >> op;
if(op == 'A'){
cin >> c;
n ++;
s[n] = s[n - 1] ^ c;
root[n] = ++ idx;
insert(n, 23, root[n - 1], root[n]);
}
else{
cin >> l >> r >> c;
cout << qurry(root[r - 1], s[n] ^ c, l - 1) << '\n';
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
while(T --){
solve();
}
return 0;
}