#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N=2e5+5;
int t, tim[N], ans[N], tin[N], tout[N], tour[N], ti, sz[N], pf[N], hvy[N];
vector<pair<int, int>> g[N];
vector<tuple<int, int, int>> que[N];
struct trie {
int sz=0, c[2][30*N], mn[30*N];
void upd(int x, int y) {
int curr=0;
for(int i=29; i>=0; i--) {
int b=(x>>i&1);
if(!c[b][curr]) {
c[b][curr]=++sz;
mn[sz]=y;
}
curr=c[b][curr];
mn[curr]=min(mn[curr], y);
}
}
int qry(int x, int y) {
int ans=0, curr=0;
for(int i=29; i>=0; i--) {
int b=(x>>i&1);
if(c[b^1][curr]&&mn[c[b^1][curr]]<=y) {
ans+=(1<<i);
curr=c[b^1][curr];
}
else
curr=c[b][curr];
}
return ans;
}
} trie;
void dfs1(int u) {
tin[u]=++ti;
tour[ti]=u;
sz[u]=1;
for(auto [v, w] : g[u]) {
pf[v]=pf[u]^w;
dfs1(v);
sz[u]+=sz[v];
if(hvy[u]==0||sz[hvy[u]]<sz[v])
hvy[u]=v;
}
tout[u]=ti;
///cout << "debug: " << u << " " << tin[u] << " " << tout[u] << endl;
}
void dfs2(int u, bool f) {
for(auto [v, w] : g[u]) {
if(v!=hvy[u])
dfs2(v, 0);
}
if(hvy[u])
dfs2(hvy[u], 1);
trie.upd(pf[u], tim[u]);
for(auto [v, w] : g[u])
if(v!=hvy[u])
for(int i=tin[v]; i<=tout[v]; i++)
trie.upd(pf[tour[i]], tim[tour[i]]);
for(auto [v, when, id] : que[u])
ans[id]=trie.qry(pf[v], when);
que[u].clear();
if(!f) {
for(int i=0; i<=trie.sz; i++)
trie.c[0][i]=trie.c[1][i]=0;
trie.sz=0;
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> t;
int curr=1, ask=0;
for(int i=1; i<=t; i++) {
string s;
int u, v;
cin >> s >> u >> v;
if(s=="Add") {
g[u].push_back({++curr, v});
tim[curr]=i;
}
else
que[v].push_back({u, i, ++ask});
}
dfs1(1);
dfs2(1, 0);
for(int i=1; i<=ask; i++)
cout << ans[i] << endl;
return 0;
}