// Author : AhmedQassem_
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
#define endl '\n'
#define ep cout << fixed << setprecision(12)
#define all(x) (x).begin(), (x).end()
#define allr(x) (x).rbegin(), (x).rend()
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const ld PI = acosl(-1.0L);
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) { return a / gcd(a, b) * b; }
void fastio() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
}
const int N = 2e5+5;
struct BinaryTrie {
static const int MAX_BIT = 30;
struct Node {
int nxt[2];
int min_id;
Node() { nxt[0] = nxt[1] = 0; min_id = INF; }
};
vector<Node> tr;
BinaryTrie() { tr.push_back(Node()); }
int add_node() { tr.push_back(Node()); return (int)tr.size() - 1; }
void insert(int x, int id) {
int u = 0;
tr[u].min_id = min(tr[u].min_id, id);
for(int i = MAX_BIT; i >= 0; --i) {
int b = (x >> i) & 1;
if(!tr[u].nxt[b]) tr[u].nxt[b] = add_node();
u = tr[u].nxt[b];
tr[u].min_id = min(tr[u].min_id, id);
}
}
int max_xor(int x, int limit) {
if(tr[0].min_id > limit) return 0;
int u = 0;
int res = 0;
for(int i = MAX_BIT; i >= 0; --i) {
int b = (x >> i) & 1;
int w = b ^ 1;
if(tr[u].nxt[w] && tr[tr[u].nxt[w]].min_id <= limit) {
res |= (1 << i);
u = tr[u].nxt[w];
} else if(tr[u].nxt[b] && tr[tr[u].nxt[b]].min_id <= limit) {
u = tr[u].nxt[b];
} else {
break;
}
}
return res;
}
};
vector<int> adj[N];
vector<int> sub[N];
BinaryTrie bt[N];
int d[N];
vector<array<int,3>> qs[N];
int ans[N];
void dfs(int u) {
sub[u].push_back(u);
bt[u].insert(d[u], u);
for(int v : adj[u]) {
dfs(v);
if(sub[u].size() < sub[v].size()) {
swap(sub[u], sub[v]);
swap(bt[u].tr, bt[v].tr);
}
for(int x : sub[v]) {
sub[u].push_back(x);
bt[u].insert(d[x], x);
}
sub[v].clear();
sub[v].shrink_to_fit();
bt[v].tr.clear();
bt[v].tr.shrink_to_fit();
}
for(auto& q : qs[u]) {
int a = q[0], limit = q[1], idx = q[2];
ans[idx] = bt[u].max_xor(d[a], limit);
}
}
void Magek() {
int q; cin >> q;
int n = 1;
d[1] = 0;
int q_cnt = 0;
for(int i = 0; i < q; i++) {
string s; cin >> s;
if(s == "Add") {
int u, w; cin >> u >> w;
n++;
adj[u].push_back(n);
d[n] = d[u] ^ w;
} else {
int a, b; cin >> a >> b;
qs[b].push_back({a, n, q_cnt++});
}
}
dfs(1);
for(int i = 0; i < q_cnt; i++) {
cout << ans[i] << endl;
}
}
int32_t main() {
fastio();
int t = 1;
while (t--) Magek();
return 0;
}//