RT,WA #4,#6,#7,MLE #5,#8~#11,#13
Code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
namespace WBLT{
const int INF=1e14;
int sz[100005<<1] , ls[100005<<1],rs[100005<<1] , val[100005<<1],bin[100005<<1],tp,rt;
int cnt=0;
constexpr double alpha=0.25;
inline bool leaf(int p){
return (!ls[p]||!rs[p]);
}
inline void pushup(int p){
if(leaf(p)) return sz[p]=1,void();
sz[p]=sz[ls[p]]+sz[rs[p]];
val[p]=val[rs[p]];
}
inline int add(int s , int l ,int r,int v){
int now=(tp>0?bin[tp--]:++cnt);
sz[now]=s,ls[now]=l,rs[now]=r,val[now]=v;
return now;
}
inline void del(int cnt){
bin[++tp]=cnt;
}
inline int merge(int a , int b){
int x;
return add(sz[a]+sz[b],a,b,val[b]);
}
inline void rotate(int p , int fg){
if(!fg){//左儿子旋转到右儿子
int l=ls[ls[p]] , r=rs[ls[p]];
del(ls[p]);
ls[p]=l;
rs[p]=merge(r,rs[p]);
pushup(p);
}
else{//右儿子旋转到左儿子
int l=ls[rs[p]] , r=rs[rs[p]];
del(rs[p]);
rs[p]=r;
ls[p]=merge(ls[p],l);
pushup(p);
}
}
inline void upd(int p){
if(leaf(p))return ;
if(alpha<=sz[ls[p]]*1.0/sz[p]&&sz[ls[p]]*1.0/sz[p]<=1-alpha)return ;
if(!(alpha<=sz[ls[p]]*1.0/sz[p])){//sz[ls[p]]<sz[rs[p]]
double row=sz[ls[rs[p]]]*1.0/sz[rs[p]];
if(row>=(1-2*alpha)/(1-alpha))rotate(rs[p],0);
rotate(p,1);
}
else{//sz[ls[p]]>sz[rs[p]]
double row=sz[ls[ls[p]]]*1.0/sz[ls[p]];
if(row>=(1-2*alpha)/(1-alpha))rotate(ls[p],1);
rotate(p,0);
}
}
inline void init(){
rt=add(1,0,0,INF);
}
inline void copy(int p1 , int p2){
ls[p1]=ls[p2],rs[p1]=rs[p2],sz[p1]=sz[p2],val[p1]=val[p2];
}
inline void insert(int p , int v){
if(leaf(p)) return ls[p]=add(1,0,0,min(val[p],v)),rs[p]=add(1,0,0,max(val[p],v)),pushup(p),upd(p),void();
if(val[ls[p]]<v)insert(rs[p],v);
else insert(ls[p],v);
pushup(p),upd(p);
}
inline void insert(int v){
insert(rt,v);
}
inline void erase(int p,int v,int fa){
if(leaf(p)){
if(ls[fa]==p)copy(fa,rs[fa]),del(ls[fa]);
else if(rs[fa]==p)copy(fa,ls[fa]),del(rs[fa]);
return ;
}
if(val[ls[p]]<v)erase(rs[p],v,p);
else erase(ls[p],v,p);
pushup(p),upd(p);
}
inline void erase(int v){
erase(rt,v,-1);
}
inline int rnk(int p,int x){
if(leaf(p))return 1;
if(val[ls[p]]<x)return rnk(rs[p],x)+sz[ls[p]];
return rnk(ls[p],x);
}
inline int rnk(int x){
return rnk(rt,x);
}
inline int kth(int p,int x){
if(sz[p]==x)return val[p];
if(sz[ls[p]]<x)return kth(rs[p],x-sz[ls[p]]);
return kth(ls[p],x);
}
inline int kth(int x){
return kth(rt,x);
}
inline int pre(int x){
return kth(rnk(x)-1);
}
inline int nxt(int x){
cerr<<x<<' '<<rnk(x+1)<<endl;
return kth(rnk(x+1));
}
};
signed main(){
WBLT::init();
int m;
cin>>m;
int op,x;
while(m--){
cin>>op>>x;
if(op==1)WBLT::insert(x);
if(op==2)WBLT::erase(x);
if(op==3)cout<<WBLT::rnk(x)<<'\n';
if(op==4)cout<<WBLT::kth(x)<<'\n';
if(op==5)cout<<WBLT::pre(x)<<'\n';
if(op==6)cout<<WBLT::nxt(x)<<'\n';
}
return 0;
}