#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN = 2e5;
const ll INF = 1e18;
ll t;
vector <ll> adj[MAXN+5];
ll tin[MAXN+5], tout[MAXN+5], dist[MAXN+5];
ll X[MAXN+5], A[MAXN+5], B[MAXN+5];
struct Trie {
ll lvl, freq = 0;
Trie *ch[2] = {NULL};
void insert(ll z) {
freq++;
if (!lvl) return;
if (ch[(z>>lvl-1)&1] == NULL) {
ch[(z>>lvl-1)&1] = new Trie();
ch[(z>>lvl-1)&1]->lvl = lvl-1;
}
ch[(z>>lvl-1)&1]->insert(z);
}
ll query(ll z) {
if (!lvl) return 0LL;
if (ch[!((z>>lvl-1)&1)] != NULL && ch[!((z>>lvl-1)&1)]->freq) {
return (1LL<<lvl-1)+ch[!((z>>lvl-1)&1)]->query(z);
}
return ch[(z>>lvl-1)&1]->query(z);
}
};
struct ST {
ll l, r;
ST *lf, *rg;
Trie val;
void build() {
val.lvl = 30;
if (l == r) return;
ll mid = (l+r)/2;
lf = new ST(), rg = new ST();
lf->l = l, lf->r = mid;
rg->l = mid+1, rg->r = r;
lf->build(), rg->build();
}
void update(ll idx, ll z) {
val.insert(z);
if (l == r) {
return;
}
ll mid = (l+r)/2;
if (idx <= mid) lf->update(idx, z);
else rg->update(idx, z);
}
ll query(ll x, ll y, ll z) {
if (l > y || r < x) return 0LL;
if (l >= x && r <= y) return val.query(z);
return max(lf->query(x, y, z), rg->query(x, y, z));
}
};
void dfs(ll idx) {
tin[idx] = ++t;
for (auto i : adj[idx]) {
dfs(i);
}
tout[idx] = t;
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
int tc = 1;
// cin >> tc;
while (tc--) {
ll Q; cin >> Q;
ll N = 1;
for (int i = 1; i <= Q; i++) {
string S; cin >> S;
if (S == "Add") {
ll P, val; cin >> P >> val;
X[i] = ++N;
adj[P].push_back(N);
dist[N] = (dist[P]^val);
}
else {
cin >> A[i] >> B[i];
}
}
dfs(1);
ST sg;
sg.l = 1, sg.r = N;
sg.build();
for (int i = 1; i <= Q; i++) {
if (X[i]) {
sg.update(tin[X[i]], dist[X[i]]);
}
else {
cout << sg.query(tin[B[i]], tout[B[i]], dist[A[i]]) << "\n";
}
}
}
}
/*
*/