#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair<int,int>
#define fir first
#define sec second
const int maxn=2e5;
vector<ii>adj[maxn+2];
int in[maxn+2],out[maxn+2],conv[maxn+2];
int pref[maxn+2];
int cnt;
struct trie{
trie *ch[2]={NULL};
void insert(int val,int ke){
if(ke==-1)return;
int bit=0;
if((val>>ke)&1)bit=1;
// cout<<val<<' '<<ke<<' '<<bit<<endl;
if(!ch[bit])ch[bit]=new trie();
ch[bit]->insert(val,ke-1);
}
int mx(int val,int ke){
if(ke==-1)return 0;
int bit=0;
if((val>>ke)&1)bit=1;
//cout<<val<<" "<<ke<<" "<<bit<<endl;
if(ch[bit^1]){
return (1<<ke)+ch[bit^1]->mx(val,ke-1);
}
else{
if(!ch[bit])return 0;
return ch[bit]->mx(val,ke-1);
}
}
};
struct seg{
int l,r;
seg *lf=0,*rg=0;
trie skrg;
seg(int x,int y){
l=x,r=y;
}
void upd(int idx,int val){
skrg.insert(val,29);
if(l==r)return;
int mid=(l+r)/2;
if(mid>=idx){
if(!lf)lf=new seg(l,mid);
lf->upd(idx,val);
}
else{
if(!rg)rg=new seg(mid+1,r);
rg->upd(idx,val);
}
}
int query(int posl,int posr,int val){
if(l>posr || r<posl)return 0;
if(l>=posl && r<=posr)return skrg.mx(val,29);
int apa=0;
if(lf)apa=max(apa,lf->query(posl,posr,val));
if(rg)apa=max(apa,rg->query(posl,posr,val));
return apa;
}
};
void dfs(int cur){
in[cur]=++cnt; conv[cnt]=cur;
for(auto x : adj[cur]){
pref[x.fir]=(pref[cur]^x.sec);
dfs(x.fir);
}
out[cur]=cnt;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int qu; cin>>qu;
int n=1;
vector<array<int,3> >slv;
for(int q=1;q<=qu;q++){
string s; cin>>s;
int a,b;
cin>>a>>b;
if(s=="Add"){
n++;
adj[a].push_back({n,b});
slv.push_back({0,a,b});
}
else{
slv.push_back({1,a,b});
}
}
dfs(1);
seg apa(1,n);
apa.upd(1,0);
int tmp=1;
for(auto [ty,a,b] : slv){
if(ty==0){
tmp++;
// cout<<in[tmp]<<"k"<<endl;
apa.upd(in[tmp],pref[tmp]);
}
else{
// cout<<in[b]<<' '<<out[b]<<" "<<pref[a]<<endl;
cout<<apa.query(in[b],out[b],pref[a])<<endl;
}
}
}