#include<bits/stdc++.h>
//#define int long long
#define little_dog puts("OvO,2021zjhs005 is better than me.")
#define lcfollower break
#define _2021zjhs005 continue
#define inf 0x3f3f3f3f
#define infi 0x3f3f3f3f3f3f3f3fll
#define up(i,x,y) for(register int i=x;i<=y;++i)
#define dn(i,x,y) for(register int i=x;i>=y;--i)
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x*f;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10|48);}
inline void writeln(int x){write(x),putchar('\n');}
inline void writesp(int x){write(x),putchar(' ');}
struct lc{
inline void fre(){freopen(".in","r",stdin);freopen(".out","w",stdout);}
inline void ext(){exit(0);}
};namespace LC{
int tot=0,root=0;
struct Treap{int val,pri,ls,rs,cnt,siz;Treap(){val=pri=ls=rs=cnt=siz=0;}}a[100001];
int newnode(int u,int val){a[u].ls=a[u].rs=0,a[u].cnt=a[u].siz=1,a[u].val=val,a[u].pri=rand();return u;}
void pushup(int u){a[u].siz=a[a[u].ls].siz+a[a[u].rs].siz+a[u].cnt;}
void spilt(int u,int val,int &x,int &y){
if(u==0){x=y=0;return ;}
if(a[u].val<=val)x=u,spilt(a[u].rs,val,a[u].rs,y);
else y=u,spilt(a[u].ls,val,x,a[u].ls);
pushup(u);
}int merge(int u,int v){
if(u==0||v==0)return u+v;
if(a[u].pri<=a[v].pri){
a[u].rs=merge(a[u].rs,v);
pushup(u);return u;
}else{
a[v].ls=merge(u,a[v].ls);
pushup(v);return v;
}
}int rk_to_val(int u,int rk){
if(rk<=a[a[u].ls].siz)return rk_to_val(a[u].ls,rk);
else if(rk<=a[a[u].ls].siz+a[u].cnt)return a[u].val;
else return rk_to_val(a[u].rs,rk-a[a[u].ls].siz-a[u].cnt);
}void insert(int u,int val){
int tmp1,tmp2,tmp3;
spilt(u,val-1,tmp1,tmp2);
spilt(tmp2,val,tmp2,tmp3);
if(tmp2==0)tmp2=newnode(++tot,val);
else ++a[tmp2].cnt;
root=merge(tmp1,merge(tmp2,tmp3));
}void deleted(int u,int val){
int tmp1,tmp2,tmp3;
spilt(u,val-1,tmp1,tmp2);
spilt(tmp2,val,tmp2,tmp3);
if(a[tmp2].cnt<=1)root=merge(tmp1,tmp3);
else --a[tmp2].cnt,root=merge(tmp1,merge(tmp2,tmp3));
}int val_to_rk(int u,int val){
int tmp1,tmp2,ans;
spilt(u,val-1,tmp1,tmp2);
ans=a[tmp1].siz;
root=merge(tmp1,tmp2);
return ans;
}int the_prev(int u,int val){
int tmp1,tmp2,ans;
spilt(u,val-1,tmp1,tmp2);
ans=rk_to_val(tmp1,a[tmp1].siz);
root=merge(tmp1,tmp2);
return ans;
}int the_next(int u,int val){
int tmp1,tmp2,ans;
spilt(u,val,tmp1,tmp2);
ans=rk_to_val(tmp2,1);
root=merge(tmp1,tmp2);
return ans;
}void bianli(int u){
if(u==0)return ;
bianli(a[u].ls);
writesp(a[u].val);
bianli(a[u].rs);
}void bianliln(int u){bianli(u),putchar('\n');}
inline void main(){
lc follower;
//follower.fre();
srand(time(NULL));
int n=read();
up(i,1,n){
int opt=read(),x=read();
switch(opt){
case 1:insert(root,x);break;
case 2:deleted(root,x);break;
case 3:writeln(val_to_rk(root,x)+1);break;
case 4:writeln(rk_to_val(root,x));break;
case 5:writeln(the_prev(root,x));break;
case 6:writeln(the_next(root,x));break;
}
}follower.ext();
}
}signed main(){
LC::main();
}
描述:#8 WA,#9到#12 TLE。