⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3481_treap.cpp

📁 一个数据结构的程序
💻 CPP
字号:
#include <iostream>
#include <cstdio>
using namespace std;
const int M=1000001;

struct node{
	int l,r,key,prio;
};

int root,size;
node tree[M];
int root1,size1;
node tree1[M];

void rot_l(int &x)
{
	int y=tree[x].r;
	tree[x].r=tree[y].l;
	tree[y].l=x;
	x=y;
}

void rot_r(int &x)
{
	int y=tree[x].l;
	tree[x].l=tree[y].r;
	tree[y].r=x;
	x=y;
}

void insert(int &x,int k,int p)
{
	if(x==-1)
	{
		x=++size;
		tree[x].l=tree[x].r=-1;
		tree[x].key=k;tree[x].prio=p;
	}
	else if(k<tree[x].key)
	{
		insert(tree[x].l,k,p);
		if(tree[x].prio<tree[tree[x].l].prio)
			rot_r(x);
	}
	else
	{
		insert(tree[x].r,k,p);
		if(tree[x].prio<tree[tree[x].r].prio)
			rot_l(x);
	}
}

void remove(int &x,int k)
{
	if(x==-1)
		return ;
	if(k<tree[x].key)
		remove(tree[x].l,k);
	else if(k>tree[x].key)
		remove(tree[x].r,k);
	else
	{
		if(tree[x].l==-1&&tree[x].r==-1)
			x=-1;
		else if(tree[x].l==-1)
			x=tree[x].r;
		else if(tree[x].r==-1)
			x=tree[x].l;
		else
		{
			if(tree[tree[x].l].prio<tree[tree[x].r].prio)
			{
				rot_l(x);
				remove(tree[x].l,k);
			}
			else
			{
				rot_r(x);
				remove(tree[x].r,k);
			}
		}
	}
}
void rot_l1(int &x)
{
	int y=tree1[x].r;
	tree1[x].r=tree1[y].l;
	tree1[y].l=x;
	x=y;
}

void rot_r1(int &x)
{
	int y=tree1[x].l;
	tree1[x].l=tree1[y].r;
	tree1[y].r=x;
	x=y;
}

void insert1(int &x,int k,int p)
{
	if(x==-1)
	{
		x=++size1;
		tree1[x].l=tree1[x].r=-1;
		tree1[x].key=k;tree1[x].prio=p;
	}
	else if(k<tree1[x].key)
	{
		insert1(tree1[x].l,k,p);
		if(tree1[x].prio>tree1[tree1[x].l].prio)
			rot_r1(x);
	}
	else
	{
		insert1(tree1[x].r,k,p);
		if(tree1[x].prio>tree1[tree1[x].r].prio)
			rot_l1(x);
	}
}

void remove1(int &x,int k)
{
	if(x==-1)
		return ;
	if(k<tree1[x].key)
		remove1(tree1[x].l,k);
	else if(k>tree1[x].key)
		remove1(tree1[x].r,k);
	else
	{
		if(tree1[x].l==-1&&tree1[x].r==-1)
			x=-1;
		else if(tree1[x].l==-1)
			x=tree1[x].r;
		else if(tree1[x].r==-1)
			x=tree1[x].l;
		else
		{
			if(tree1[tree1[x].l].prio>tree1[tree1[x].r].prio)
			{
				rot_l1(x);
				remove1(tree1[x].l,k);
			}
			else
			{
				rot_r1(x);
				remove1(tree1[x].r,k);
			}
		}
	}
}

int main()
{
	int cmd,a,b;
	root=root1=-1;
	size=size1=-1;
	while(1)
	{
		scanf("%d",&cmd);
		if(cmd==0)
			break;
		if(cmd==1)
		{
			scanf("%d %d",&a,&b);
			insert(root,a,b);
			insert1(root1,a,b);
		}
		else if(cmd==2)
		{
			if(root==-1)
				printf("0\n");
			else
			{
				printf("%d\n",tree[root].key);
				remove1(root1,tree[root].key);
				remove(root,tree[root].key);
			}
		}
		else
		{
			if(root1==-1)
				printf("0\n");
			else
			{
				printf("%d\n",tree1[root1].key);
				remove(root,tree1[root1].key);
				remove1(root1,tree1[root1].key);
			}
		}
	}
	return 0;
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -