rt,马蜂不好,请见谅
#include <bits/stdc++.h>
using namespace std ;
typedef int ll ;
#define For(i,s,t) for(ll i = s;i <= t;++ i)
#define RFor(i,s,t) for(ll i = s;i >= t;-- i)
const ll N = 1e5 + 5,ABS_X = 1e7 + 5 ;
struct node{ ll val,lp,rp,real,size ; bool used ; } t[N] ;
const double alpha = 0.75 ;
ll root,st[N],top,order[N] ;
void init_stack(){
RFor(i,1e5,1)st[++ top] = i ;
return ;
}
void init_data(node& a,ll x = 1e9){
if(x != 1e9)a.val = x ;
a.lp = a.rp = 0 ;
a.real = a.size = a.used = 1 ;
return ;
}
ll topGet(){ return st[top --] ; }
ll topPush(ll x){ return st[++ top] = x ; }
bool notbalanced(ll p){
return t[p].size * alpha < double(max(t[t[p].lp].size,t[t[p].rp].size)) ; }
void push_up(ll p){
const ll lp = t[p].lp,rp = t[p].rp ;
t[p].real = t[p].size = 0 ;
if(lp)t[p].real += t[lp].real,t[p].size += t[lp].size ;
if(rp)t[p].real += t[rp].real,t[p].size += t[rp].size ;
return ;
}
void inorder(ll p,ll& tot){
if(!p)return ;
inorder(t[p].lp,tot) ;
if(t[p].used)order[++ tot] = p ;
else topPush(p) ;
inorder(t[p].rp,tot) ;
return ;
}
ll build(ll l,ll r){
if(l > r)return 0 ;
if(l == r){ init_data(t[order[l]]) ; return l ; }
ll mid = (l + r) >> 1,rt = order[mid] ;
t[rt].lp = build(l,mid - 1),t[rt].rp = build(mid + 1,r) ;
push_up(rt) ;
return rt ;
}
void rebuild(ll& p){
ll tot = 0 ;
inorder(p,tot) ;
p = tot ? build(1,tot) : 0 ;
return ;
}
void insert(ll& p,ll x){
if(!p){ init_data(t[p = topGet()],x) ; return ; }
++ t[p].size,++ t[p].real ;
if(x < t[p].val)insert(t[p].lp,x) ;
else insert(t[p].rp,x) ;
if(notbalanced(p))rebuild(p) ;
return ;
}
ll rankGet(ll p,ll x){
if(!p)return 0 ;
if(x > t[p].val)return t[t[p].lp].real + t[p].used + rankGet(t[p].rp,x) ;
return rankGet(t[p].lp,x) ;
}
ll kth(ll rank){
ll p = root ;
while(p)
if(t[p].used && t[t[p].lp].real == rank)return p ;
else if(t[t[p].lp].real >= rank)p = t[p].lp ;
else rank -= t[t[p].lp].real + t[p].used,p = t[p].rp ;
return p ;
}
void erase(ll p,ll val){
-- t[p].real ;
if(t[p].used == true && t[p].val == val){ t[p].used = false ; return ; }
if(val >= t[p].val)erase(t[p].rp,val) ;
else erase(t[p].lp,val) ;
if(notbalanced(p))rebuild(p) ;
return ;
}
ll biggest(ll x){
ll xrk = rankGet(root,x) ;
ll p = kth(xrk - 1) ;
//if(!p || t[p].val >= x)return -1e9 ;
return t[p].val ;
}
ll smallest(ll x){
ll xrk = rankGet(root,x + 1) ;
ll p = kth(xrk) ;
return t[p].val ;
}
ll n,op,x ;
int main(){
ios::sync_with_stdio(0) ; cin.tie(0) ;cout.tie(0);
init_stack() ;
cin >> n ;
while(n --){
cin >> op >> x ;
switch(op){
case 1 : insert(root,x) ; break ;
case 2 : erase(root,x) ; break ;
case 3 :
cout << rankGet(root,x) + 1 << '\n' ;
break ;
case 4 :
cout << t[kth(x - 1)].val << '\n' ;
break ;
case 5 : cout << biggest(x) << '\n' ;
break ;
case 6 : cout << smallest(x) << '\n' ;
break ;
}
}
return 0 ;
}