#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
struct node{
node *ls,*rs;
int val,del,siz,rnd;
node(int _val):val(_val),del(1),siz(1),rnd(rand()){ls=rs=nullptr;}
void push_up(){siz=del+(ls?ls->siz:0)+(rs?rs->siz:0);}
node(){;}
};
node *root,*rt[N];
node *copy(node *p){node *rot=new node;*rot=*p;return rot;}
pair<node*,node*>split(node *p,int k){
if(p==nullptr) return {nullptr,nullptr};
p=copy(p);
if(p->val<=k){
auto temp=split(p->rs,k);
p->rs=temp.first;
p->push_up();
return {p,temp.second};
}
if(k<p->val){
auto temp=split(p->ls,k);
p->ls=temp.second;
p->push_up();
return {temp.first,p};
}
}
tuple<node*,node*,node*>split_by_rank(node *p,int k){
if(p==nullptr) return {nullptr,nullptr,nullptr};
p=copy(p);
int lsiz=(p->ls?p->ls->siz:0);
if(k<=lsiz){
node *l,*mid,*r;
tie(l,mid,r)=split_by_rank(p->ls,k);
p->ls=r;
p->push_up();
return {l,mid,p};
}
if(lsiz<k&&k<=lsiz+p->del){
node *l=p->ls;
node *r=p->rs;
p->ls=p->rs=nullptr;
p->push_up();
return {l,p,r};
}
if(lsiz+p->del<k){
node *l,*mid,*r;
tie(l,mid,r)=split_by_rank(p->rs,k-lsiz-p->del);
p->rs=l;
p->push_up();
return {p,mid,r};
}
}
node *merge(node *n,node *m){
if(n==nullptr&&m==nullptr) return nullptr;
if(n==nullptr) return m;
if(m==nullptr) return n;
if(n->rnd<m->rnd){
node *p=copy(n);
p->rs=merge(p->rs,m);
p->push_up();
return p;
}else{
node *p=copy(m);
p->ls=merge(n,p->ls);
p->push_up();
return p;
}
}
void insert(int k){
auto temp=split(root,k);
auto t_l=split(temp.first,k-1);
if(t_l.second) temp.second->del++,temp.second->push_up();
else t_l.second=new node(k);
root=merge(merge(t_l.first,t_l.second),temp.second);
}
void erase(int k){
auto temp=split(root,k);
auto t_l=split(temp.first,k-1);
if(t_l.second==nullptr){root=merge(merge(t_l.first,t_l.second),temp.second);return;}
if(t_l.second->del>1){
t_l.second->del--;
t_l.second->push_up();
t_l.first=merge(t_l.first,t_l.second);
}else{
if(t_l.second==temp.first) temp.first=nullptr;
delete t_l.second;
t_l.second=nullptr;
}
root=merge(t_l.first,temp.second);
}
int qval(node *p,int k){
node *l,*mid,*r;tie(l,mid,r)=split_by_rank(p,k);
int ans=mid?mid->val:-INT_MAX;
p=merge(merge(l,mid),r);
return ans;
}
int qrank(node *p,int k){
auto temp=split(p,k-1);
int ans=(temp.first?temp.first->siz:0)+1;
p=merge(temp.first,temp.second);
return ans;
}
int qpre(int k){
auto temp=split(root,k-1);
int ans=qval(temp.first,temp.first?temp.first->siz:0);
root=merge(temp.first,temp.second);
return ans;
}
int qnxt(int k){
auto temp=split(root,k);
int ans=qval(temp.second,1);
root=merge(temp.first,temp.second);
return (ans==-INT_MAX?INT_MAX:ans);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int n;cin>>n;
for(int i=1;i<=n;i++){
int v,opt,x;cin>>v>>opt>>x;
root=rt[v];
if(opt==1) insert(x);
if(opt==2) erase(x);
if(opt==3) cout<<qrank(root,x)<<'\n';
if(opt==4) cout<<qval(root,x)<<'\n';
if(opt==5) cout<<qpre(x)<<'\n';
if(opt==6) cout<<qnxt(x)<<'\n';
rt[i]=root;
}
return 0;
}
悬关