#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+5;
#define siz(x) (t[x].siz)
#define ls(x) (t[x].ls)
#define rs(x) (t[x].rs)
#define key(x) (t[x].key)
#define pri(x) (t[x].pri)
struct node{
int ls, rs, key, pri, siz;
}t[N << 6];
int tsiz = 0;
int root[N];
void update(int rt){
siz(rt) = siz(ls(rt)) + siz(rs(rt)) + 1;
}
int newnode(int x = 0){
++tsiz;
siz(tsiz) = 1;
ls(tsiz) = rs(tsiz) = 0;
key(tsiz) = x;
pri(tsiz) = rand();
return tsiz;
}
void split(int rt, int x, int &l, int &r){
if (rt == 0){
l = r = 0;
return;
}
if (key(rt) <= x){
int id = newnode();
t[id] = t[x];
split(rs(id), x, rs(id), r);
update(id);
}
else{
int id = newnode();
t[id] = t[x];
split(ls(id), x, l, ls(id));
update(id);
}
}
int merge(int l, int r){
if (l == 0 || r == 0) return l + r;
if (pri(l) > pri(r)){
int id = newnode();
t[id] = t[l];
rs(id) = merge(rs(id), r);
update(id);
return id;
}
else{
int id = newnode();
t[id] = t[r];
ls(id) = merge(l, ls(id));
update(id);
return id;
}
}
void insert(int &root, int x){
int l, r;
split(root, x, l, r);
newnode(x);
root = merge(merge(l, tsiz), r);
}
void del(int &root, int x){
int l, m, r;
split(root, x, l, r);
split(l, x - 1, l, m);
m = merge(ls(m), rs(m));
root = merge(merge(l, m), r);
}
int getrank(int &root, int x){
int l, r, res;
split(root, x - 1, l, r);
res = siz(l) + 1;
root = merge(l, r);
return res;
}
int kth(int rt, int k){
if (k == siz(ls(rt)) + 1) return key(rt);
if (k <= siz(ls(rt))) return kth(ls(rt), k);
return kth(rs(rt), k - siz(ls(rt)) - 1);
}
int pre(int &root, int x){
int l, r, res, k;
split(root, x - 1, l, r);
if (!l) return -2147483647;
res = kth(l, siz(l));
root = merge(l, r);
return res;
}
int suf(int &root, int x){
int l, r, res;
split(root, x, l, r);
if (!r) return 2147483647;
res = kth(r, 1);
root = merge(l, r);
return res;
}
int main(){
srand(time(NULL));
int q;
cin >> q;
for (int i = 1;i <= q;i++){
int v, op, x;
cin >> v >> op >> x;
root[i] = root[v];
if (op == 1) insert(root[i], x);
else if (op == 2) del(root[i], x);
else if (op == 3) cout << getrank(root[i], x) << '\n';
else if (op == 4) cout << kth(root[i], x) << '\n';
else if (op == 5) cout << pre(root[i], x) << '\n';
else cout << suf(root[i], x) << '\n';
}
return 0;
}