#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e6 + 5;
const ll inf = (1ll << 31) - 1;
ll n, m, ans, lst, op, a, idx;
ll l[N], r[N], sz[N], val[N], key[N], ver[N];
inline ll New(ll v) {
sz[++idx] = 1;
val[idx] = v;
key[idx] = rand();
return idx;
}
inline void Update(ll u) {
sz[u] = sz[l[u]] + sz[r[u]] + 1;
return;
}
inline ll Copy(ll u) {
sz[++idx] = sz[u];
val[idx] = val[u];
key[idx] = key[u];
l[idx] = l[u];
r[idx] = r[u];
return idx;
}
void Split(ll u, ll v, ll &x, ll &y) {
if (!u) {
x = y = 0;
return;
}
ll z = Copy(u);
if (val[u] <= v) {
x = z;
Split(r[z], v, r[z], y);
} else {
y = z;
Split(l[z], v, x, l[z]);
}
Update(z);
return;
}
ll Merge(ll x, ll y) {
if (!x || !y)
return x | y;
ll z;
if (key[x] < key[y]) {
z = Copy(y);
r[z] = Merge(r[z], y);
} else {
z = Copy(x);
l[z] = Merge(x, l[z]);
}
Update(z);
return z;
}
inline ll Insert(ll root, ll v) {
ll x, y, z;
z = New(v);
Split(root, v, x, y);
return Merge(Merge(x, z), y);
}
inline ll Delete(ll root, ll v) {
ll x, y, z;
Split(root, v, x, y);
Split(x, v - 1, x, z);
z = Merge(l[z], r[z]);
return Merge(Merge(x, z), y);
}
inline ll Rank(ll root, ll v) {
ll x, y, ans;
Split(root, v - 1, x, y);
ans = sz[x] + 1;
root = Merge(x, y);
return ans;
}
ll K_th(ll u, ll k) {
if (!u)
return 1;
if (sz[l[u]] + 1 == k)
return val[u];
if (k <= sz[l[u]])
return K_th(l[u], k);
return K_th(r[u], k - sz[l[u]] - 1);
}
inline ll Pre(ll root, ll v) {
ll x, y, ans;
if (K_th(root, 1) > v)
return -inf;
Split(root, v - 1, x, y);
ans = K_th(x, sz[x]);
root = Merge(x, y);
return ans;
}
inline ll Suc(ll root, ll v) {
ll x, y, ans;
if (K_th(root, sz[root]) < v)
return inf;
Split(root, v, x, y);
ans = K_th(y, 1);
root = Merge(x, y);
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> m;
ver[0] = 0;
for (int i = 1; i <= m; i++) {
cin >> n >> op >> a;
if (op == 1)
ver[i] = Insert(ver[n], a);
else if (op == 2)
ver[i] = Delete(ver[n], a);
else if (op == 3)
cout << Rank(ver[n], a) << '\n';
else if (op == 4)
cout << K_th(ver[n], a) << '\n';
else if (op == 5)
cout << Pre(ver[n], a) << '\n';
else if (op == 6)
cout << Suc(ver[n], a) << '\n';
if (op != 1 && op != 2)
ver[i] = ver[n];
}
return 0;
}