treap 普通平衡树

     普通treap中最普通的板子(数组版)

      

#include<stdio.h>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define inf 10000000
using namespace std;
struct tree
{
	int l,r,size,tot,h,rd;
} t[100005];
int n,root,fro,bac,hh;
void l_swap(int &root)
{
	int k=t[root].r;
	t[root].r=t[k].l;
	t[k].l=root;
	t[k].size=t[root].size;
	t[root].size=t[t[root].l].size+t[t[root].r].size+t[root].tot;
	root=k;
}
void r_swap(int &root)
{
	int k=t[root].l;
	t[root].l=t[k].r;
	t[k].r=root;
	t[k].size=t[root].size;
	t[root].size=t[t[root].l].size+t[t[root].r].size+t[root].tot;
	root=k;
}
void build(int &root,int k)
{
	if(!root)
	{
		root=++hh;
		t[root].h=k;
		t[root].size=t[root].tot=1;
		t[root].rd=rand();
		return;
	}
	t[root].size++;
	if(t[root].h==k)t[root].tot++;
	else
	{
		if(t[root].h>k)
		{
			build(t[root].l,k);
			if(t[t[root].l].rd<t[root].rd);
			   r_swap(root);
		}
		else
		{
			build(t[root].r,k);
			if(t[t[root].r].rd<t[root].rd)
			    l_swap(root);
		}
	}
}
void del(int &root,int k)
{
	if(!root)return;
	if(t[root].h==k)
	{
		if(t[root].tot>1)
		{
			t[root].tot--;
			t[root].size--;
			return;
		}
		if(t[root].l*t[root].r==0)
		    root=t[root].l+t[root].r;
		else
		{
			if(t[t[root].l].rd<t[t[root].r].rd)
			    r_swap(root);
			else
			    l_swap(root);
			del(root,k);
		}
	}
	else
	{
		 t[root].size--;
		 if(k>t[root].h)del(t[root].r,k);
		 else del(t[root].l,k);
	}
}
void FRO(int &root,int k)
{
	if(!root)return;
	if(t[root].h<k)
	{
		fro=t[root].h;
		FRO(t[root].r,k);
	}
	else FRO(t[root].l,k);
}
void BAC(int &root,int k)
{
	if(!root)return;
	if(t[root].h>k)
	{
		bac=t[root].h;
		BAC(t[root].l,k);
	}
	else BAC(t[root].r,k);
}
int num(int &root,int k)
{
	if(!root)return 0;
	if(t[root].h==k)
	    return t[t[root].l].size+1;
	else
	{
		if(t[root].h>k)return num(t[root].l,k);
		else  return t[t[root].l].size+t[root].tot+num(t[root].r,k);
	}
}
int Q(int &root,int k)
{
	if(!root)return 0;
	if(t[t[root].l].size+1<=k&&t[t[root].l].size+t[root].tot>=k)
	     return t[root].h;
	if(t[t[root].l].size>=k)
	     return Q(t[root].l,k);
	if(t[t[root].l].size<k)
	     return Q(t[root].r,k-t[root].tot-t[t[root].l].size);
}
int yjn()
{
//	 freopen("phs.in","r",stdin);
  //  freopen("phs.out","w",stdout);
	scanf("%d",&n);
	int x,y;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&x,&y);
		if(x==1)build(root,y);
		if(x==2)del(root,y);
		if(x==3){printf("%d\n",num(root,y));}
		if(x==4){printf("%d\n",Q(root,y));}
		if(x==5){fro=-inf;FRO(root,y);printf("%d\n",fro);}
		if(x==6){bac=-inf;BAC(root,y);printf("%d\n",bac);}
	}
}
int qty=yjn();
int main(){;}

posted @ 2017-10-06 20:19  Hzoi_QTY  阅读(120)  评论(0编辑  收藏  举报