RT,并不知道哪里出错了,调了两天了(从TLE变WA)/kk/kk
朴素的二叉查找树:
#include<cstdio>
#define IL inline
const int MAXN=1e5,INF=2147483647;
int n,op,x;
IL 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*10)+(ch^48);
ch=getchar();
}
return x*f;
}
struct BinarySearchTree
{
int fa,lson,rson;
bool left;
int lsize,rsize;
int val,cnt;
}a[MAXN+5];
int p;
IL void insert(int x)
{
if(!p)
{
a[++p].val=x;
a[p].cnt=1;
return;
}
int cur=1,fa=0;
bool less;
while(cur)
{
if(x==a[cur].val)
{
a[cur].cnt++;
if(a[cur].left)
a[a[cur].fa].lsize++;
else a[a[cur].fa].rsize++;
return;
}
if(x<a[cur].val)
{
less=true;
a[cur].lsize++;
fa=cur;
cur=a[cur].lson;
}
else
{
less=false;
a[cur].rsize++;
fa=cur;
cur=a[cur].rson;
}
}
a[++p].fa=fa;
a[p].val=x;
a[p].cnt=1;
if(less)
{
a[fa].lson=p;
a[p].left=true;
}
else
{
a[fa].rson=p;
a[p].left=false;
}
}
IL int rankof(int x)
{
int cur=1,rk=1;
while(a[cur].val!=x&&cur)
if(x>a[cur].val)
{
rk+=a[cur].lsize+a[cur].cnt;
cur=a[cur].rson;
}
else cur=a[cur].lson;
if(!cur) return 0;
return rk;
}
IL int getrking(int x)
{
--x;
int cur=1,rk=0;
while(rk!=x)
if(x>=a[cur].lsize+a[cur].cnt+rk)
{
rk+=a[cur].lsize+a[cur].cnt;
cur=a[cur].rson;
}
else if(x>=a[cur].lsize+rk) return a[cur].val;
else cur=a[cur].lson;
//if(!cur) return INF;
return a[cur].val;
}
IL int pre(int x)
{
int cur=1,res=-INF;
while(cur)
{
if(a[cur].val<x)
{
res=a[cur].val;
cur=a[cur].rson;
}
else cur=a[cur].lson;
}
return res;
}
IL int post(int x)
{
int cur=1,res=INF;
while(cur)
{
if(a[cur].val>x)
{
res=a[cur].val;
cur=a[cur].lson;
}
else cur=a[cur].rson;
}
return res;
}
int main()
{
n=read();
for(int i=1;i<=n;++i)
{
op=read();x=read();
switch(op)
{
case 1:
printf("%d\n",rankof(x));
break;
case 2:
printf("%d\n",getrking(x));
break;
case 3:
printf("%d\n",pre(x));
break;
case 4:
printf("%d\n",post(x));
break;
case 5:
insert(x);
break;
}
}
return 0;
}