#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<stack>
using namespace std;
struct Node{
int key,w,cnt;
Node *l,*r;
Node(int key,int cnt){
this->key=key;
this->cnt=cnt;
this->w=rand();
}
};
class Treap{
public:
Node* root,*null;
Treap(){
null=new Node(1<<30,0);
root=null->l=null->r=null;
}
void right_rot(Node *&x){
Node* y=x->l;
x->l=y->r;
y->r=x;
x=y;
}
void left_rot(Node* &x){
Node* y=x->r;
x->r=y->l;
y->l=x;
x=y;
}
void insert(Node* &x,int e){
if(x==null){
x = new Node(e,1);
x->l=x->r=null;
}else if(e<x->key){
insert(x->l,e);
if(x->l->w<x->w)right_rot(x);
}else if(e>x->key){
insert(x->r,e);
if(x->r->w<x->w)left_rot(x);
}else x->cnt++;
}
void remove(Node* &x,int e){
if(x==null)return;
if(e<x->key)remove(x->l,e);
else if(e>x->key)remove(x->r,e);
else{
if(x->l==null||x->r==null){
Node* y= x;
x=(x->l!=null)?x->l:x->r;
delete y;
}else{
if(x->l->w<x->r->w){
right_rot(x);
remove(x->r,e);
}else{
left_rot(x);
remove(x->l,e);
}
}
}
}
Node* pre(Node* x,Node* y,int e){
if(x==null)return y;
if(e<x->key)return pre(x->l,y,e);
else return pre(x->r,x,e);
}
Node* next(Node* x,Node* y,int e){
if(x==null)return y;
if(e<=x->key)return next(x->l,x,e);
else return next(x->r,y,e);
}
int count(int e){
Node* p = pre(root,null,e);
Node* q = next(root,null,e);
return (q->key-p->key-1<0)?0:(q->key-p->key-1);
}
};
stack<int>q;
int main(){
Treap *treap = new Treap();
int n,m;
while(~scanf("%d%d\n",&n,&m)){
treap->insert(treap->root,0);
treap->insert(treap->root,n+1);
while(m--){
char c;
c=getchar();
if(c=='D'){
int t;
scanf("%d",&t);getchar();
treap->insert(treap->root,t);
q.push(t);
}else if(c=='Q'){
int t;
scanf("%d",&t);getchar();
printf("%d\n",treap->count(t));
}else if(c=='R'){
//scanf("\n");
getchar();
if(!q.empty()){
int t=q.top();q.pop();
treap->remove(treap->root,t);
}
}
}
while(!q.empty()){
int t=q.top();q.pop();
treap->remove(treap->root,t);
}
treap->remove(treap->root,0);
treap->remove(treap->root,n+1);
}
}
Treap模板
最新推荐文章于 2022-07-14 11:40:17 发布