甚至7pts
#include<bits/stdc++.h>
using namespace std;
//替罪羊树
double out=0.75114514;
struct tree{
int fa,l,r,z,size;
}TZY[100010];
int cnt,root;
vector<int>tre,trae,_empty;
void p_sh(int u){
tre.push_back(u);
trae.push_back(TZY[u].z);
if(TZY[u].l)p_sh(TZY[u].l);
if(TZY[u].r)p_sh(TZY[u].r);
}
void _grow(int l,int r,int m){
if(l==r)return;
else{
int ls=(l+m)>>1,rs=(r+m+1)>>1;
if(l!=ls){
TZY[tre[m]].l=ls;
TZY[tre[ls]].fa=trae[m];
_grow(l,m-1,ls);
}
if(m+1!=rs){
_grow(m+1,r,rs);
TZY[tre[m]].r=rs;
TZY[tre[rs]].fa=trae[m];
}
}
}
void chonggou(int u){
tre.push_back(u);
trae.push_back(TZY[u].z);
if(TZY[u].l)p_sh(TZY[u].l);
if(TZY[u].r)p_sh(TZY[u].r);
sort(tre.begin(),tre.end());
sort(trae.begin(),trae.end());
int l=0,r=tre.size(),m=(l+r)>>1,ls=(l+m)>>1,rs=(r+m+2)>>1;
for(int i=0;i<trae.size();i++)TZY[i].z=trae[i];
TZY[tre[m]].l=ls;
TZY[tre[ls]].fa=trae[m];
if(l!=ls)_grow(l,m-1,ls);
TZY[tre[m]].r=rs;
TZY[tre[rs]].fa=trae[m];
if(m!=rs)_grow(m+1,r,rs);
trae=tre=_empty;
}
//以上为维护平衡代码
//插入
void charu(int x,int u){
if(TZY[u].size==0){
TZY[++cnt].fa=0;
TZY[cnt].z=x;
TZY[cnt].size=1;
root=cnt;
return;
}else{
if(x<TZY[u].z){
if(TZY[u].l==0){
TZY[++cnt].fa=u;
TZY[cnt].z=x;
TZY[cnt].size=1;
TZY[u].l=cnt;
}else{
if(TZY[TZY[u].l].z<x){
TZY[++cnt].fa=u;
TZY[cnt].z=x;
TZY[cnt].size=TZY[TZY[u].l].size+1;
TZY[cnt].l=TZY[u].l;
TZY[TZY[u].l].fa=cnt;
TZY[u].l=cnt;
}else charu(x,TZY[u].l);
}
}else{
if(TZY[u].r==0){
TZY[++cnt].fa=u;
TZY[cnt].z=x;
TZY[cnt].size=1;
TZY[u].r=cnt;
}else{
if(TZY[TZY[u].r].z>x){
TZY[++cnt].fa=u;
TZY[cnt].z=x;
TZY[cnt].size=TZY[TZY[u].r].size+1;
TZY[cnt].r=TZY[u].r;
TZY[TZY[u].r].fa=cnt;
TZY[u].r=cnt;
}else charu(x,TZY[u].r);
}
}
}
TZY[u].size++;
if(TZY[TZY[u].l].size>TZY[u].size*out)chonggou(u);
if(TZY[TZY[u].r].size>TZY[u].size*out)chonggou(u);
}
//重构
void shanchu(int x,int u){
TZY[u].size--;
if(x<TZY[u].z)shanchu(x,TZY[u].l);
else if(x>TZY[u].z)shanchu(x,TZY[u].r);
else{
if(u==root)root=TZY[u].l;
TZY[TZY[u].l].fa=TZY[u].fa;
TZY[TZY[u].l].r=TZY[u].r;
TZY[TZY[u].l].size=TZY[u].size-1;
TZY[TZY[u].r].fa=TZY[u].l;
}
if(TZY[TZY[u].l].size>TZY[u].size*out)chonggou(u);
if(TZY[TZY[u].r].size>TZY[u].size*out)chonggou(u);
}
//查小
int xiao(int x,int u){
if(u==0)return 0;
else if(x<TZY[u].z)return xiao(x,TZY[u].l);
else return xiao(x,TZY[u].r)+TZY[TZY[u].l].size;
}
//排名
int paimin(int x,int u,int size){
if(x-size==TZY[u].size)return TZY[u].z;
else if(x-size<TZY[TZY[u].l].size)return paimin(x,TZY[u].l,size);
else return paimin(x,TZY[u].r,size+TZY[TZY[u].l].size);
}
//前驱
int qianqu(int x){
int id=root,pre;
while(id){
if(x>TZY[id].z)pre=TZY[id].z,id=TZY[id].r;
else id=TZY[id].l;
}
return pre;
}
//后继
int houji(int x){
int id=root,next;
while(id){
if(x<TZY[id].z)next=TZY[id].z,id=TZY[id].l;
else id=TZY[id].r;
}
return next;
}
//void outtree(int u){
// cout<<TZY[u].fa<<' '<<TZY[u].l<<' '<<TZY[u].r<<' '<<TZY[u].z<<' '<<TZY[u].size<<'\n';
// if(TZY[u].l)outtree(TZY[u].l);
// if(TZY[u].r)outtree(TZY[u].r);
//}
void outtrae(int u){
cout<<TZY[u].fa<<' '<<u<<'\n';
if(TZY[u].l)outtrae(TZY[u].l);
if(TZY[u].r)outtrae(TZY[u].r);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,opt,x;
cin>>n;
while(n--){
cin>>opt>>x;
switch(opt){
case 1:{
charu(x,root);
break;
}
case 2:{
shanchu(x,root);
break;
}
case 3:{
cout<<xiao(x,root)<<'\n';
break;
}
case 4:{
cout<<paimin(x,root,0)<<'\n';
break;
}
case 5:{
cout<<qianqu(x)<<'\n';
break;
}
case 6:{
cout<<houji(x)<<'\n';
break;
}
}
cout<<'\n';
outtrae(root);
cout<<'\n';
}
// outtrae(root);
// cout<<'\n';
}