#include <cstdio>
const long long move = 1e9 + 1;
int cnt, rt[500001], to[16000001][2], siz[16000001];
void insert(int f, int t, int x){
x += move;
int lu = rt[f], u = rt[t], lv, v, p;
for (int b = 30;b >= 0;b --){
siz[u] = siz[lu] + 1;
p = (x >> b) & 1;
lv = to[lu][p], v = to[u][p];
if (!v) to[u][p] = v = ++ cnt;
to[u][!p] = to[lu][!p];
u = v, lu = lv;
}
siz[u] = siz[lu] + 1;
}
bool find(int f, int x){
x += move;
int u = rt[f], p;
for (int b = 30;b >= 0;b --){
p = (x >> b) & 1;
if (!to[u][p]) return 0;
u = to[u][p];
}
return 1;
}
void erase(int f, int t, int x){
x += move;
int lu = rt[f], u = rt[t], lv, v, p;
for (int b = 30;b >= 0;b --){
siz[u] = siz[lu] - 1;
p = (x >> b) & 1;
lv = to[lu][p], v = to[u][p];
if (!v) to[u][p] = v = ++ cnt;
to[u][!p] = to[lu][!p];
u = v, lu = lv;
}
siz[u] = siz[lu] - 1;
}
int rank(int f, int x){
x += move;
int u = rt[f], p, ans = 1;
for (int b = 30;b >= 0;b --){
p = (x >> b) & 1;
if (p) ans += siz[to[u][0]];
u = to[u][p];
if (!u) return ans;
}
return ans;
}
int kth(int f, int k){
int u = rt[f], ans = 0;
for (int b = 30;b >= 0;b --){
if (siz[to[u][0]] < k) ans |= 1 << b, k -= siz[to[u][0]], u = to[u][1];
else u = to[u][0];
}
return ans - move;
}
int pre(int f, int x){
int ans = kth(f, rank(f, x) - 1);
return (ans == -1000000001 ? -2147483647 : ans);
}
int nxt(int f, int x){
int ans = kth(f, rank(f, x));
return (ans == 1147483646 ? 2147483647 : ans);
}
int n, vi, op, x;
int main(){
scanf("%d", &n);
for (int i = 1;i <= n;i ++){
scanf("%d%d%d", &vi, &op, &x);
if (op > 2) rt[i] = rt[vi];
if (op == 1) rt[i] = ++ cnt, insert(vi, i, x);
if (op == 2 && find(vi, x)) rt[i] = ++ cnt, erase(vi, i, x);
if (op == 3) printf("%d\n", rank(vi, x));
if (op == 4) printf("%d\n", kth(vi, x));
if (op == 5) printf("%d\n", pre(vi, x));
if (op == 6) printf("%d\n", nxt(vi, x));
if (op == 7) printf("%d\n", find(vi, x));
}
}