只AC了#1 #2 #11,大佬求调 QAQ
#include<bits/stdc++.h>
#define N 1000020
using namespace std;
int n,rt,tot,ls[N],rs[N],val[N],ord[N],siz[N],cnt[N];
void push_up(int id){siz[id]=siz[ls[id]]+rs[id]+cnt[id];}
void turn_right(int &id)
{
int t=ls[id];
ls[id]=rs[t];
rs[t]=id;
push_up(ls[id]);
push_up(id);
id=t;
}
void turn_left(int &id)
{
int t=rs[id];
rs[id]=ls[t];
ls[t]=id;
siz[t]=siz[id];
push_up(rs[id]);
push_up(id);
id=t;
}
void insert(int &id,int x)
{
if(!id)
{
id=++tot;
siz[id]=cnt[id]=1;
val[id]=x;
ord[id]=rand();
return;
}
siz[id]++;
if(val[id]==x)cnt[id]++;
else if(val[id]<x)
{
insert(rs[id],x);
if(ord[rs[id]]<ord[id])turn_left(id);
}
else
{
insert(ls[id],x);
if(ord[ls[id]]<ord[id])turn_right(id);
}
push_up(id);
}
void del(int &id,int x)
{
if(!id)return;
if(val[id]==x)
{
if(cnt[id]>1)
{
cnt[id]--;
push_up(id);
return;
}
if(ls[id]||rs[id])
{
if(!rs[id]||ord[ls[id]]>ord[rs[id]])
{
turn_right(id);
del(rs[id],x);
}
else
{
turn_left(id);
del(ls[id],x);
}
push_up(id);
}
else id=0;
return;
}
if(x<val[id])del(ls[id],x);
else del(rs[id],x);
push_up(id);
}
int query_rk(int id,int x)
{
if(!id)return 0;
if(val[id]==x)return siz[ls[id]]+1;
else if(x<val[id])return query_rk(ls[id],x);
else return siz[ls[id]]+cnt[id]+query_rk(rs[id],x);
}
int query_val(int id,int rk)
{
if(!id)return 0x3f3f3f3f;
if(rk<=siz[ls[id]])return query_val(ls[id],rk);
else if(rk<=siz[ls[id]]+cnt[id])return val[id];
else return query_val(rs[id],rk-siz[ls[id]]-cnt[id]);
}
int query_pre(int x)
{
int id=rt,pre;
while(id)
{
if(val[id]<x)
{
pre=val[id];
id=rs[id];
}
else id=ls[id];
}
return pre;
}
int query_next(int x)
{
int id=rt,nxt;
while(id)
{
if(val[id]>x)
{
nxt=val[id];
id=ls[id];
}
else id=rs[id];
}
return nxt;
}
int main()
{
// freopen("1.txt","w",stdout);
srand(time(0));
cin>>n;
while(n--)
{
int op,x;
cin>>op>>x;
switch(op)
{
case 1:insert(rt,x);break;
case 2:del(rt,x);break;
case 3:cout<<query_rk(rt,x)<<endl;break;
case 4:cout<<query_val(rt,x)<<endl;break;
case 5:cout<<query_pre(x)<<endl;break;
case 6:cout<<query_next(x)<<endl;break;
}
}
return 0;
}