Treap模板

#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);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值