Treap

 粗略的试了一下,大概是没有问题的

#include<cstdio>

#include<cstring>
#include<time.h>
#include<stdlib.h>
#define random(x) (rand()%x)
#define maxn 100007
using namespace std;
int fa[maxn],son[maxn][2],siz[maxn],priority[maxn],weight[maxn],root=0,counter=0;
void clear()
{
srand((int)time(0));//这里不用每次更新
memset(fa,0,sizeof(int));
memset(son,0,sizeof(int));
memset(siz,0,sizeof(int));
memset(priority,0,sizeof(int));
memset(weight,0,sizeof(int));
}
inline int getpri()
{
return random(100);//太大好像不行诶
}
inline int getpos(int now,int val)
{
if(weight[now]>val&&son[now][0])return getpos(son[now][0],val);//注意判断是否为空
if(weight[now]<val&&son[now][1])return getpos(son[now][1],val);
return now;
}
inline int askflag(int now)
{if(son[fa[now]][0]==now)return 0;return 1;}
inline void updata(int now)
{siz[now]=1+siz[son[now][0]]+siz[son[now][1]];} 
inline void rorate(int now)
{
int f=fa[now],flag=askflag(now);
if(root==f){root=now;fa[now]=-1;}
else {son[fa[f]][askflag(f)]=now;fa[now]=fa[f];}
if(son[now][!flag])fa[son[now][!flag]]=f;
son[f][flag]=son[now][!flag];
fa[f]=now;
son[now][!flag]=f;
updata(f);updata(now);
}
inline void tenance(int now)
{
while(priority[fa[now]]>priority[now])//居然比splay好写
rorate(now);
}
inline int rank(int now,int x)
{
if(weight[now]<weight[x])return 1+siz[son[now][0]]+rank(son[now][1],x);
if(weight[now]==weight[x])return 1+siz[son[now][0]];
if(weight[now]>weight[x])return rank(son[now][0],x);
}
inline int Kth(int now,int k)
{
if(siz[son[now][0]]+1==k)return now;
if(siz[son[now][0]]+1>k)return Kth(son[now][0],k);
if(siz[son[now][0]]+1<k)return Kth(son[now][1],k-1-siz[son[now][0]]);
}
inline void insert(int val)
{
if(!root)
{
fa[root=++counter]=-1;
weight[counter]=val;
updata(counter);
}
else 
{
int pos=getpos(root,val);
fa[++counter]=pos;
weight[counter]=val;//之前居然忘记赋值了
if(weight[pos]>val)son[pos][0]=counter;
if(weight[pos]<val)son[pos][1]=counter;
updata(counter),updata(pos);
}
priority[counter]=getpri();
tenance(counter);
}
int main()
{
int n,m,temp;
char ss[10],c;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&temp);
insert(temp);
}
for(int i=1;i<=m;i++)
{
scanf("%s",ss);
scanf("%d",&temp);
c=ss[0];
if(c=='R')printf("%d\n",rank(root,temp));
if(c=='K')printf("%d",weight[Kth(root,temp)]); 
}
return 0;
}
posted @ 2017-04-17 00:34  OcahIBye  阅读(181)  评论(0编辑  收藏  举报