记录
#include<bits/stdc++.h>
using namespace std;
using namespace std::chrono;
const int MOD=0x3f3f3f3f;
struct Node{
int pri,key,lk,rk,siz,cnt;
}tr[100005];
int n,m,a,b,i,j,k,num,ans,op,x,root;
long long lar;
mt19937 mnd(system_clock::now().time_since_epoch().count());
int add(int Key)
{
tr[++num].key=Key;
tr[num].pri=mnd();
return num;
}
pair<int,int>split(int Root,int Key)
{
if(!Root)return make_pair(0,0);
if(Key<tr[Root].key)
{
pair<int,int>Lt=split(tr[Root].lk,Key);
tr[Root].lk=Lt.second;
tr[Root].siz=tr[tr[Root].lk].siz+tr[tr[Root].rk].siz+tr[Root].cnt;
return make_pair(Lt.first,Root);
}
else
{
pair<int,int>Rt=split(tr[Root].rk,Key);
tr[Root].rk=Rt.first;
tr[Root].siz=tr[tr[Root].lk].siz+tr[tr[Root].rk].siz+tr[Root].cnt;
return make_pair(Root,Rt.second);
}
}
int merge(int U,int V)
{
if(!U)return V;
if(!V)return U;
if(tr[U].pri>tr[V].pri)
{
tr[U].rk=merge(tr[U].rk,V);
tr[U].siz=tr[tr[U].lk].siz+tr[tr[U].rk].siz+tr[U].cnt;
return U;
}
else
{
tr[V].lk=merge(U,tr[V].lk);
tr[V].siz=tr[tr[V].lk].siz+tr[tr[V].rk].siz+tr[V].cnt;
return V;
}
}
int insert(int Root,int Key)
{
pair<int,int>Sp1=split(Root,Key-1);
pair<int,int>Sp2=split(Sp1.second,Key);
if(!Sp2.first)Sp2.first=add(Key);
++tr[Sp2.first].siz;
++tr[Sp2.first].cnt;
return merge(merge(Sp1.first,Sp2.first),Sp2.second);
}
int del(int Root,int Key)
{
pair<int,int>Sp1=split(Root,Key-1);
pair<int,int>Sp2=split(Sp1.second,Key);
if(Sp2.first)
if(tr[Sp2.first].cnt==1)Sp2.first=0;
else --tr[Sp2.first].siz,--tr[Sp2.first].cnt;
return merge(merge(Sp1.first,Sp2.first),Sp2.second);
}
int count(int Root,int Key,int& Ans)
{
pair<int,int>Sp=split(Root,Key-1);
Ans=tr[Sp.first].siz+1;
return merge(Sp.first,Sp.second);
}
int query(int Root,int Rnk)
{
if(tr[tr[Root].lk].siz<Rnk&&tr[tr[Root].lk].siz+tr[Root].cnt>=Rnk)return tr[Root].key;
if(tr[tr[Root].lk].siz>=Rnk)return query(tr[Root].lk,Rnk);
return query(tr[Root].rk,Rnk-tr[tr[Root].lk].siz-tr[Root].cnt);
}
int pre(int Root,int Key,int& Ans)
{
pair<int,int>Sp=split(Root,Key);
int Now=Sp.first;
while(Now&&tr[Now].rk)Now=tr[Now].rk;
Ans=tr[Now].key;
return merge(Sp.first,Sp.second);
}
int nxt(int Root,int Key,int& Ans)
{
pair<int,int>Sp=split(Root,Key);
int Now=Sp.second;
while(Now&&tr[Now].lk)Now=tr[Now].lk;
Ans=tr[Now].key;
return merge(Sp.first,Sp.second);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(i=1;i<=n;++i)
{
cin>>op>>x;
switch(op)
{
case 1:root=insert(root,x);break;
case 2:root=del(root,x);break;
case 3:root=count(root,x,ans);cout<<ans<<endl;break;
case 4:ans=query(root,x);cout<<ans<<endl;break;
case 5:root=pre(root,x,ans);cout<<ans<<endl;break;
case 6:root=nxt(root,x,ans);cout<<ans<<endl;break;
}
}
return 0;
}