#include<bits/stdc++.h>
using namespace std;
typedef struct{
int ls,rs,siz,val,key;
}Tree;
Tree New;
vector<Tree> t = {New};
int idx;
inline int Copy(int p)
{
t.push_back(t[p]);
return (++idx);
}
inline int Build(int val)
{
t.push_back(New);
idx++;
t[idx].val = val;
t[idx].key = rand();
t[idx].siz = 1;
return idx;
}
inline void push_up(int p)
{
t[p].siz = t[t[p].ls].siz + t[t[p].rs].siz + 1;
}
int merge(int x,int y)
{
if(!x || !y) return (x ^ y);
if(t[x].key < t[y].key)
{
x = Copy(x);
t[x].rs = merge(t[x].rs,y);
push_up(x);
return x;
}
y = Copy(y);
t[y].ls = merge(x,t[y].ls);
push_up(y);
return y;
}
void splitval(int p,int k,int& l,int& r)
{
if(!p)
{
l = r = 0;
return;
}
p = Copy(p);
if(t[p].val <= k)
{
l = p;
splitval(t[p].rs,k,t[p].rs,r);
}else{
r = p;
splitval(t[p].ls,k,l,t[p].ls);
}
push_up(p);
}
void splitsiz(int p,int k,int& l,int& r)
{
if(!p)
{
l = r = 0;
return;
}
p = Copy(p);
if(t[t[p].ls].siz + 1 <= k)
{
l = p;
splitsiz(t[p].rs,k - 1 - t[t[p].ls].siz,t[p].rs,r);
}else{
r = p;
splitsiz(t[p].ls,k,l,t[p].ls);
}
push_up(p);
}
int root[500011];
int n;
int v,op,x;
signed main()
{
srand(time(0));
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n;
for(int i = 1;i <= n;i++)
{
cin >> v >> op >> x;
root[i] = root[v];
int& rt = root[i];
if(op == 1)
{
int l,r;
splitval(rt,x,l,r);
rt = merge(merge(l,Build(x)),r);
}else if(op == 2)
{
int l,r;
splitval(rt,x,l,r);
if(l)
{
int ll,lr;
splitsiz(l,t[l].siz - 1,ll,lr);
if(t[lr].val == x)
{
rt = merge(ll,r);
}else{
rt = merge(l,r);
}
}
}else if(op == 3)
{
int l,r;
splitval(rt,x - 1,l,r);
cout << t[l].siz + 1 << "\n";
}else if(op == 4)
{
int l,r;
splitsiz(rt,x,l,r);
int ll,lr;
splitsiz(l,x - 1,ll,lr);
cout << t[lr].val << "\n";
}else if(op == 5)
{
int l,r;
splitval(rt,x - 1,l,r);
if(l)
{
int ll,lr;
splitsiz(l,t[l].siz - 1,ll,lr);
cout << t[lr].val << "\n";
}else{
cout << INT_MIN << "\n";
}
}else{
int l,r;
splitval(rt,x,l,r);
if(r)
{
int rl,rr;
splitsiz(r,1,rl,rr);
cout << t[rl].val << "\n";
}else{
cout << INT_MAX << "\n";
}
}
}
return 0;
}