#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int inf=~0U>>1;
struct ps
{
int id,val;
ps(int _i=0,int _val=0){id=_i;val=_val;}
friend bool operator <(ps q,ps p)
{
return q.val<p.val||(q.val==p.val&&q.id>p.id);
}
friend bool operator ==(ps q,ps p)
{
return q.val==p.val&&q.id==p.id;
}
friend bool operator >(ps q,ps p)
{
return p<q;
}
friend bool operator !=(ps q,ps p)
{
return q.val!=p.val||q.id!=p.id;
}
};
template <class T>
class treap
{
struct node
{
T val;
int key,size;
node *c[2];
node(T v,node *x){val=v,c[0]=c[1]=x,size=1;key=rand()-1;}
void rz(){size=c[0]->size+c[1]->size+1;}
}*root,*null;
void ro(node *&x,bool d)
{
node *t=x->c[d];
x->c[d]=t->c[!d];
t->c[!d]=x;
x->rz();t->rz();x=t;
}
void insert(node *&x,T v)
{
if(x==null) {x=new node(v,null);return;}
if(x->val==v) return ;
bool d=(v>x->val);
insert(x->c[d],v);
if(x->c[d]->key<x->key)
ro(x,d); else x->rz();
}
void dele(node*&x,T v)
{
if(x==null) return ;
if(x->val==v)
{
bool d=x->c[0]->key>x->c[1]->key;
if(x->c[d]==null)
{
x=null;
return ;
}
ro(x,d);
dele(x->c[!d],v);
}
else
{
bool d=v>x->val;
dele(x->c[d],v);
}
x->rz();
}
T select(node *x,int k)
{
if(x->c[0]->size==k) return x->val;
else if(x->c[0]->size>k) return select(x->c[0],k);
else return select(x->c[1],k-x->c[0]->size-1);
}
int ran(node *x,T v)
{
if(x==null) return 0;
if(x->val==v) return x->c[0]->size;
if(x->val>v) return ran(x->c[0],v);
else return ran(x->c[1],v)+1+x->c[0]->size;
}
void pos(node *x) {if(x->c[0]!=null) pos(x->c[0]);if(x->c[1]!=null) pos(x->c[1]);delete x;}
void pr(node *x){if(x!=null) {cout<<x->val.id<<" ";pr(x->c[0]);pr(x->c[1]);}}
public:
treap(){null=new node(0,0);null->size=0;null->key=inf;root=null;}
void ins(T v){insert(root,v);}
void del(T v){dele(root,v);}
int rank(T v){return ran(root,v);}
T find_k(int k){if(root->size<k||k==0) return ps(0,0);return select(root,k-1);}
void pr(){pr(root);puts("");}
void pos(){pos(root);}
};
struct seg
{
int l,r,id;
}q[111111];
bool cmp(seg p,seg q)
{
return p.l<q.l||(q.l==p.l&&p.r>=q.r);
}
int ans[111111];
int n;
int main()
{
treap<ps> T;
int opt;
int nu=0;
while(scanf("%d",&opt)==1&&opt)
{ int k,p;
ps q;
switch (opt){
case 1:
scanf("%d%d",&k,&p);
T.ins(ps(k,p));
++nu;
break;
case 2:
q=T.find_k(nu);
printf("%d\n",q.id);
if(q!=ps(0,0)) T.del(q),nu--;
break;
case 3:
q=T.find_k(1);
printf("%d\n",q.id);
if(q!=ps(0,0)) T.del(q),nu--;
break;
}
}
return 0;
}
poj 3481 treap 练习
最新推荐文章于 2019-07-25 19:43:53 发布