#include <bits/stdc++.h>
using namespace std;
constexpr int N = 2'00'000;
struct trie{
trie* a[2];
trie () { a[0] = a[1] = nullptr; }
void add (int x) {
trie* root = this;
for (int i = 30; i >= 0; --i) {
int bit = (x >> i) & 1;
if (!root->a[bit]) root->a[bit] = new trie();
root = root->a[bit];
}
}
int get (int x) {
int ans = 0;
trie* root = this;
for (int i = 30; i >= 0; --i) {
int bit = (x >> i) & 1;
if (root->a[bit ^ 1]) root = root->a[bit ^ 1], ans |= 1 << i;
else if (root->a[bit]) root = root->a[bit];
}
return ans;
}
};
trie t[N << 2];
int q, tin[N], tout[N], d[N], rt = 0, tim = 0;
vector<int> a[N];
vector<tuple<int, int, int>> Q;
void upd (int i, int l, int r, int id, int x){
t[i].add(x);
if (l == r) return;
int m = (l + r) >> 1;
if (id <= m) upd(i << 1, l, m, id, x);
else upd(i << 1 | 1, m + 1, r, id, x);
}
int get (int i, int l, int r, int L, int R, int x) {
if (l > R || r < L) return 0ll;
if (L <= l && r <= R) return t[i].get(x);
int m = (l + r) >> 1;
return max(get(i << 1, l, m, L, R, x), get(i << 1 | 1, m + 1, r, L, R, x));
}
void upd (int i, int x) { upd(1, 0, N - 1, i, x); }
int get (int l, int r, int x) { return get(1, 0, N - 1, l, r, x); }
void dfs (int v) {
tin[v] = tim++;
for (int u : a[v]) {
dfs(u);
}
tout[v] = tim - 1;
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> q;
while (q--) {
string s;
cin >> s;
int x, y;
if (s == "Add") {
cin >> x >> y, --x;
++rt;
a[x].emplace_back(rt);
d[rt] = d[x] ^ y;
Q.emplace_back(0, x, y);
}
else {
cin >> x >> y, --x, --y;
Q.emplace_back(1, x, y);
}
}
dfs(0);
rt = 0;
for (auto [typ, x, y] : Q) {
if (typ) {
cout << get(tin[y], tout[y], d[x]) << '\n';
}
else {
++rt;
upd(tin[rt], d[rt]);
}
}
return 0;
}