rt,#1~#2 #21~#24 AC,#3~#20 WA,#25 RE/WA/MLE
#include<bits/stdc++.h>
using namespace std;
using namespace __gnu_cxx;
//#define int long long
#ifndef int
#define INF INT_MAX
#endif
#ifdef int
#define INF LLONG_MAX
#endif
#define pii pair<int,int>
#define vi vector<int>
#define pipii pair<int,pii>
#define vpii vector<pair<int,int>>
#define _max(x,y) (((x)>(y))?(x):(y))
#define _min(x,y) (((x)<(y))?(x):(y))
#define max(...) max({__VA_ARGS__})
#define min(...) min({__VA_ARGS__})
#define tomax(x,...) ((x)=max((x),__VA_ARGS__))
#define tomin(x,...) ((x)=min((x),__VA_ARGS__))
#define tomx(x,...) tomax(x,__VA_ARGS__)
#define tomn(x,...) tomin(x,__VA_ARGS__)
#define link tfshtrj
#define y1 drshzhsrd
#define mkp make_pair
#define pb push_back
#define eb(x) emplace_back(x)
#define rep(x,y,z) for(int x=(y);x<=(z);x++)
#define per(x,y,z) for(int x=(y);x>=(z);x--)
#define all(x) x.begin(),x.end()
#define allt(x,y,z) x.begin()+y,x.begin()+z
#define fi first
#define se second
//-O2 -std=c++14 -DONLINE_JUDGE -Wall -Wextra -Wl,-stack=536870912
#define ls(x) x->son[0]
#define rs(x) x->son[1]
#define siz(x) ((x)?(x->siz):0)
mt19937_64 gen(random_device{}());
uniform_int_distribution<int> rnd(1,INF>>1);
struct node{
node* son[2];
int val,prio,cnt,siz;
node(int v=0){
val=v,cnt=1,siz=1;
son[0]=son[1]=0;
prio=rnd(gen);
}
node(node*y){
son[0]=y->son[0];
son[1]=y->son[1];
val=y->val;
prio=y->prio;
cnt=y->cnt;
siz=y->siz;
}
void pushup(){
siz=cnt;
siz+=siz(son[0]);
siz+=siz(son[1]);
}
}*root[500005*40];
pair<node*,node*> split(node*p,int key){
if(nullptr==p) return {0,0};
if(p->val<=key){
auto t=split(rs(p),key);
rs(p)=t.fi;
p->pushup();
return {p,t.se};
}else{
auto t=split(ls(p),key);
ls(p)=t.se;
p->pushup();
return {t.fi,p};
}
}
node* merge(node*u,node*v){
if((nullptr==u)&&(nullptr==v)) return 0;
if(u&&(nullptr==v)) return u;
if((nullptr==u)&&v) return v;
if(u->prio<v->prio){
rs(u)=merge(rs(u),v);
u->pushup();
return u;
}else{
ls(v)=merge(u,ls(v));
v->pushup();
return v;
}
}
void insert(int pre,int now,int val){
if(root[pre]) root[now]=new node(root[pre]);//cout<<__LINE__<<endl;
auto t=split(root[now],val);
auto lt=split(t.fi,val-1);
node* newn;
if(nullptr==lt.se){
newn=new node(val);
}else{
lt.se->cnt++;
lt.se->siz++;
}
auto lt2=merge(lt.fi,lt.se?lt.se:newn);
root[now]=merge(lt2,t.se);
}
void erase(int pre,int now,int val){
if(root[pre]) root[now]=new node(root[pre]);
auto t=split(root[now],val);
auto lt=split(t.fi,val-1);
if(lt.se->cnt>1){
lt.se->cnt--;
lt.se->siz--;
lt.fi=merge(lt.fi,lt.se);
}else{
if(t.fi==lt.se) t.fi=0;
delete lt.se;
lt.se=0;
}
root[now]=merge(lt.fi,t.se);
}
int askrnk(node*& p,int val){
auto t=split(p,val-1);
int rnk=(t.fi?t.fi->siz+1:1);
p=merge(t.fi,t.se);
return rnk;
}
//int askval(node*p,int rk){
////assert(p);assert(ls(p));
//// if(!p) assert(0);
//// assert(p);
//// if((ls(p)?ls(p)->siz:0)>=rk) return askval(ls(p),rk);
//// if(p->cnt+(ls(p)?ls(p)->siz:0)>=rk) return p->val;
//// return /*assert(rs(p)),*/askval(rs(p),rk-(ls(p)?ls(p)->siz:0)-p->cnt);
// //assert(ls(p));
// if(rk<=siz(ls(p)))return askval(ls(p),rk);
// else if(rk<=siz(ls(p))+p->cnt)return p->val;
// else return askval(ls(p),rk-siz(ls(p))-p->cnt);
//}
int askval(node*&p,int rk){
//assert(p);assert(ls(p));
// if(!p) assert(0);
// assert(p);
if((ls(p)?ls(p)->siz:0)>=rk) return askval(ls(p),rk);
if(p->cnt+(ls(p)?ls(p)->siz:0)>=rk) return p->val;
return /*assert(rs(p)),*/askval(rs(p),rk-(ls(p)?ls(p)->siz:0)-p->cnt);
}
int askpre(node*p,int val){
// assert(p);
//
// auto t=split(p,val-1);
// cout<<"askpre2: "<<(t.fi?t.fi->siz:-1)<<"\n";
// int ans=askval(t.fi,t.fi->siz);
// p=merge(t.fi,t.se);
// return ans;
int ans=INT_MIN+1;
while(p){
// cout<<"askpre"<<(p?p->val:-1)<<endl;
if(p->val<val){
ans=max(p->val,ans);
p=rs(p);
}else p=ls(p);
}
return ans;
}
int asknxt(node*p,int val){
assert(p);
// cout<<"asknxt"<<(p?p->val:-1)<<endl;
// auto t=split(p,val);
// int ans=askval(t.se,1);
// p=merge(t.fi,t.se);
// return ans;
int ans=INT_MAX;
while(p){
if(p->val>val){
ans=min(p->val,ans);
p=ls(p);
}else p=rs(p);
}
return ans;
}
#define val(x) ((x)?(x->val):-1)
void debug(node*p){
if(!p) return;
cout<<"dot: "<<val(p)<<"\nson: "<<val(ls(p))<<" "<<val(rs(p))<<endl;
debug(ls(p));
debug(rs(p));
}
int x,n,m,op,ans,last,v;
main(){
ios::sync_with_stdio(0),cin.tie(nullptr);
cin>>m;
rep(i,1,m){
cin>>v>>op>>x;
if(op==1) insert(v,i,x);
else if(op==2) erase(v,i,x);
else if(op==3) cout<<askrnk(root[v],x)<<"\n";
else if(op==4) cout<<askval(root[v],x)<<"\n";
else if(op==5) cout<<askpre(root[v],x)<<"\n";
else cout<<asknxt(root[v],x)<<"\n";
if(op>2){
root[i]=new node(root[v]);
}
}
}