Cod sursa(job #339997)

Utilizator moonbeamElma Moonbeam moonbeam Data 12 august 2009 14:48:36
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<cstdio>
#define N 200001
struct heap{int v,p;}h[N],aux,key;
int n,nh;
void cobor(int k)
{
	int fiu;
	do
	{
		fiu=0;
		if (2*k<=n)
		{
			fiu=2*k;
			if (2*k+1&&h[fiu].v>h[2*k+1].v)
				fiu=2*k+1;
			if(h[fiu].v>h[k].v)
				fiu=0;
		}
		if (fiu)
		{
			aux=h[k];
			h[k]=h[fiu];
			h[fiu]=aux;
			k=fiu;
		}
	}
	while (fiu);
}
void urc(int k)
{
	key=h[k];
	while (k-1&&key.v<h[k/2].v)
	{
		h[k]=h[k/2];
		k/=2;
	}
	h[k]=key;
}
void cut(int k)
{
	h[k]=h[n];
	--n;
	if (k-1&&h[k].v<h[k/2].v)
		urc(k);
	else
		cobor(k);
}
void insert(int x)
{
	h[++n].v=x;
	++nh;
	h[n].p=nh;
	urc(n);
}
void cut1(int k)
{
	for (int i=1; i<=n; ++i)
		if (h[i].p==k)
		{
			cut(i);
			return;
		}
}
void citire()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	int c;
	scanf("%d",&c);
	while (c)
	{
		--c;
		int w,c1;
		scanf("%d",&w);
		if (w==1)
		{
			scanf("%d",&c1);
			insert(c1);
			continue;
		}
		if (w==2)
		{
			scanf("%d",&c1);
			cut1(c1);
			continue;
		}
		if (w==3)
		{
			printf("%d\n",h[1].v);
			continue;
		}
	}
}
int main()
{
	citire();
	return 0;
}