#include <iostream>
#include <unordered_map>
#include <cstdio>
#define int long long
using namespace std;
const int inf = 2147483647;
struct tree
{
int k, ls, rs;
} t[500100 << 5];
int rt[500100], cnt;
unordered_map<int, int> m;
inline int copy(int tp)
{
t[++cnt] = t[tp];
return cnt;
}
inline void insert(int &tp, int l, int r, int x, int k)
{
tp = copy(tp);
t[tp].k += k;
if (l == r) return;
int mid = (l + r) >> 1;
if (x <= mid) insert(t[tp].ls, l, mid, x, k);
else insert(t[tp].rs, mid + 1, r, x, k);
}
inline int rk(int tp, int l, int r, int ql, int qr)
{
if (!tp) return 0;
if (ql <= l && r <= qr) return t[tp].k;
int mid = (l + r) >> 1, ans = 0;
if (ql <= mid) ans += rk(t[tp].ls, l, mid, ql, qr);
if (mid < qr) ans += rk(t[tp].rs, mid + 1, r, ql, qr);
return ans;
}
inline int kth(int tp, int l, int r, int k)
{
if (l == r) return l;
int mid = (l + r) >> 1, x = t[t[tp].ls].k;
if (x >= k) return kth(t[tp].ls, l, mid, k);
else return kth(t[tp].rs, mid + 1, r, k - x);
}
signed main()
{
int n; cin >> n;
for (int i = 1; i <= n; ++i)
{
int v, op, x;
cin >> v >> op >> x;
rt[i] = rt[v];
if (op == 1) insert(rt[i], -inf, inf, x, 1), ++m[x];
if (op == 2) if (m[x] > 0) insert(rt[i], -inf, inf, x, -1), --m[x];
if (op == 3) cout << rk(rt[i], -inf, inf, -inf, x - 1) + 1 << "\n";
if (op == 4) cout << kth(rt[i], -inf, inf, x) << "\n";
if (op == 5) cout << kth(rt[i], -inf, inf, rk(rt[i], -inf, inf, -inf, x - 1)) << "\n";
if (op == 6) cout << kth(rt[i], -inf, inf, rk(rt[i], -inf, inf, -inf, x) + 1) << "\n";
}
return 0;
}