对了第一个和最后一个点,其他都是mle了
#include <iostream>//平衡树treap,相同的节点放在左子树里
#include <ctime>
using namespace std;
const int kMaxN=1e5+1;
struct SORTTREE
{
int val,size,num;
int ls,rs;
}tr[kMaxN];
int n;
int cnt,root=0;
void ReCount(int where)
{
tr[where].size=tr[tr[where].ls].size+tr[tr[where].rs].size+1;
}
void Left(int &where)//把where的左子树转上来
{
int lson=tr[where].ls;
tr[where].ls=tr[lson].rs;
tr[lson].rs=where;
ReCount(where);
ReCount(lson);
where=lson;
}
void Right(int &where)//把右子树转上来
{
int rson=tr[where].rs;
tr[where].rs=tr[rson].ls;
tr[rson].ls=where;
ReCount(where);
ReCount(rson);
where=rson;
}
void Insert(int &where,int x)//插入
{
if(!where)
{
where=++cnt;
tr[where].val=x;
tr[where].size=1;
tr[where].num=rand();
return;
}
if(x<=tr[where].val)
{
Insert(tr[where].ls,x);
if(tr[tr[where].ls].num<tr[where].num)Left(where);
}
else
{
Insert(tr[where].rs,x);
if(tr[tr[where].rs].num<tr[where].num)Right(where);
}
}
void Delete(int &where,int x)//删除
{
if(tr[where].val==x)
{
if(!tr[where].ls*tr[where].rs)
{
where=tr[where].ls+tr[where].rs;
return;
}
else if(tr[tr[where].ls].num>tr[tr[where].rs].num)
{
Right(where);
Delete(tr[where].ls,x);
}
else
{
Left(where);
Delete(tr[where].rs,x);
}
}
else if(x<tr[where].val)Delete(tr[where].ls,x);
else Delete(tr[where].rs,x);
ReCount(where);
}
int GetRank(int where,int x)
{
if(!where)return 1;
if(x<=tr[where].val)return GetRank(tr[where].ls,x);
else return GetRank(tr[where].rs,x)+tr[tr[where].ls].size+1;
}
int GetNum(int where,int rank)
{
if(tr[where].ls==rank-1)return tr[where].val;
if(rank<=tr[where].ls)return GetNum(tr[where].ls,rank);
else return GetNum(tr[where].rs,rank-tr[tr[where].ls].size-1);
}
int Getqq(int where,int x)
{
if(!where)return -1e8;
if(x>tr[where].val)return max(tr[where].val,Getqq(tr[where].rs,x));
else return Getqq(tr[where].ls,x);
}
int Gethj(int where,int x)
{
if(!where)return 1e8;
if(x<tr[where].val)return min(tr[where].val,Gethj(tr[where].ls,x));
else return Gethj(tr[where].rs,x);
}
int main()
{
//freopen("P3369_1.in","r",stdin);
srand(time(0));
cin>>n;
while(n--)
{
int opt,x;
cin>>opt>>x;
if(opt==1)
{
Insert(root,x);
}
if(opt==2)
{
Delete(root,x);
}
if(opt==3)
{
cout<<GetRank(root,x)<<"\n";
}
if(opt==4)
{
cout<<GetNum(root,x)<<"\n";
}
if(opt==5)
{
cout<<Getqq(root,x)<<"\n";
}
if(opt==6)
{
cout<<Gethj(root,x)<<"\n";
}
}
return 0;
}