题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4006
裸treap,模板来自po主:http://www.cnblogs.com/Mathics/p/3967592.html 致敬
#include <cstdio>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#define MAXN 1000005
using namespace std;
int cnt,rt;
int n,k;
struct Tree
{
int key, size, pri, c[2];
void set(int x, int y, int z)
{
key=x;
pri=y;
size=z;
c[0]=c[1]=0;
}
}T[MAXN];
void rotate(int &x,int p)
{
int y=T[x].c[!p];
T[x].size=T[x].size-T[y].size+T[T[y].c[p]].size;
T[x].c[!p]=T[y].c[p];
T[y].size=T[y].size-T[T[y].c[p]].size+T[x].size;
T[y].c[p]=x;
x=y;
}
void ins(int key,int &x)
{
if(x==0)
T[x=++cnt].set(key,rand(),1);
else
{
T[x].size++;
int p=key<T[x].key;
ins(key,T[x].c[!p]);
if(T[x].pri<T[T[x].c[!p]].pri)
rotate(x,p);
}
}
void del(int key,int &x)
{
if(T[x].key==key)
{
if(T[x].c[0]&&T[x].c[1])
{
int p=T[T[x].c[0]].pri > T[T[x].c[1]].pri;
rotate(p, x);
del(key, T[x].c[p]);
}
else
{
if(!T[x].c[0])
x=T[x].c[1];
else
x=T[x].c[0];
}
}
else
{
T[x].size--;
int p=key>T[x].key;
del(key, T[x].c[p]);
}
}
int find(int p,int &x)
{
if(p==T[T[x].c[0]].size+1)
return (T[x].key);
if(p>T[T[x].c[0]].size+1)
find(p-T[T[x].c[0]].size-1,T[x].c[1]);
else
find(p,T[x].c[0]);
}
int main()
{
while(scanf("%d %d",&n,&k)==2)
{
rt=0;
cnt=0;
for (int i=1;i<=n;i++)
{
char x;
int y;
scanf("%c",&x);
while (x!='I'&&x!='Q')
scanf("%c",&x);
if (x=='I') scanf("%d",&y),ins(y,rt);
else printf("%d\n",find(cnt+1-k,rt));
}
}
return 0;
}