code:
#include<bits/stdc++.h>
using namespace std;
const int N=500005;
int cnt,x,y,z,rt;
struct FhqTreapNode
{
int sz,lc,rc,rd,w;
}hq[N];
struct FhqTreap
{
void update(int u)
{
hq[u].sz=hq[hq[u].lc].sz+hq[hq[u].rc].sz+1;
}
int nd_init(int w)
{
hq[++cnt]={1,0,0,rand(),w};
}
void split(int u,int w,int &l,int &r)
{
if(u)
{
if(hq[u].w<=w)
{
l=u;
split(hq[u].rc,w,hq[u].rc,r);
}
else
{
r=u;
split(hq[u].lc,w,l,hq[u].lc);
}
update(u);
}
else l=r=0;
}
int merge(int u,int v)
{
if(!u||!v)return u+v;
if(hq[u].rd<hq[v].rd)
{
hq[u].rc=merge(hq[u].rc,v);
update(u);
return u;
}
else
{
hq[v].lc=merge(u,hq[v].lc);
update(v);
return v;
}
}
int querk(int u,int rk)
{
while(1)
{
int p=hq[hq[u].lc].sz+1;
if(rk==p)return u;
if(rk<p)u=hq[u].lc;
if(rk>p)
{
rk-=p;
u=hq[u].rc;
}
}
}
void ins(int w)
{
split(rt,w,x,y);
rt=merge(merge(x,nd_init(w)),y);
}
void del(int w)
{
split(rt,w,x,z);
split(x,w-1,x,y);
y=merge(hq[y].lc,hq[y].rc);
rt=merge(merge(x,y),z);
}
int rnk(int w)
{
split(rt,w-1,x,y);
rt=merge(x,y);
return hq[x].sz+1;
}
int val(int rk)
{
return hq[querk(rt,rk)].w;
}
int prv(int w)
{
split(rt,w-1,x,y);
rt=merge(x,y);
return hq[querk(x,hq[x].sz)].w;
}
int nxt(int w)
{
split(rt,w,x,y);
rt=merge(x,y);
return hq[querk(y,1)].w;
}
};
int main()
{
srand(time(0));
FhqTreap t;
int n,op,x;
cin>>n;
while(n--)
{
cin>>op>>x;
if(op==1)t.ins(x);
if(op==2)t.del(x);
if(op==3)cout<<t.rnk(x)<<'\n';
if(op==4)cout<<t.val(x)<<'\n';
if(op==5)cout<<t.prv(x)<<'\n';
if(op==6)cout<<t.nxt(x)<<'\n';
}
}