#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls(u) (tr[u].ls)
#define rs(u) (tr[u].rs)
#define sum(u) (tr[u].sum)
const int N = 5e5+5;
struct node{
int ls, rs;
int sum;
}tr[50000005];
int cnt = 0, root[N];
void add(int &u, int pre, int l, int r, int pos, int k){
if (!u) u = ++cnt;
tr[u] = tr[pre];
if (l == r){
sum(u) += k;
if (sum(u) < 0) sum(u) = 0;
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) add(ls(u), ls(pre), l, mid, pos, k);
else add(rs(u), rs(pre), mid + 1, r, pos, k);
sum(u) = sum(ls(u)) + sum(rs(u));
}
int kth(int u, int l, int r, int k){
if (l == r) return l;
int x = sum(ls(u));
int mid = (l + r) >> 1;
if (x >= k) return kth(ls(u), l, mid, k);
else return kth(rs(u), mid + 1, r, k - x);
}
int query(int u, int l, int r, int ql, int qr){
if (!u) return 0;
if (ql <= l && r <= qr) return sum(u);
int mid = (l + r) >> 1;
if (qr <= mid) return query(ls(u), l, mid, ql, qr);
else if (ql > mid) return query(rs(u), mid + 1, r, ql, qr);
else return query(ls(u), l, mid, ql, mid) + query(rs(u), mid + 1, r, mid + 1, qr);
}
int qrank(int t, int x){
return query(root[t], -1e9, 1e9, -1e9, x - 1) + 1;
}
int pre(int t, int x){
return kth(root[t], -1e9, 1e9, query(root[t], -1e9, 1e9, -1e9, x - 1));
}
int suc(int t, int x){
return kth(root[t], -1e9, 1e9, query(root[t], -1e9, 1e9, -1e9, x) + 1);
}
int main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int q;
cin >> q;
for (int now = 1;now <= q;now++){
int t, op, x;
cin >> t >> op >> x;
if (op == 1){
add(root[now], root[t], -1e9, 1e9, x, 1);
}
else if (op == 2){
add(root[now], root[t], -1e9, 1e9, x, -1);
}
else if (op == 3){
cout << qrank(t, x) << '\n';
root[now] = root[t];
}
else if (op == 4){
cout << kth(root[t], -1e9, 1e9, x) << '\n';
root[now] = root[t];
}
else if (op == 5){
cout << pre(t, x) << '\n';
root[now] = root[t];
}
else{
cout << suc(t, x) << '\n';
root[now] = root[t];
}
}
return 0;
}