Cod sursa(job #340001)

Utilizator moonbeamElma Moonbeam moonbeam Data 12 august 2009 15:21:32
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<cstdio>
#define N 200001
struct heap{int v,p;}h[N],aux,key;
int n,nh,v[N];
void cobor(int k)
{
	int fiu;
	do
	{
		fiu=0;
		if (2*v[k]<=n)
		{
			fiu=v[2*k];
			if (2*v[k]+1<=n&&h[fiu].v>h[v[2*k+1]].v)
				fiu=v[2*k+1];
			if(h[fiu].v>h[v[k]].v)
				fiu=0;
		}
		if (fiu)
		{
			aux=h[v[k]];
			h[v[k]]=h[fiu];
			h[fiu]=aux;
			v[k]=fiu;
		}
	}
	while (fiu);
}
void urc(int k)
{
	key=h[v[k]];
	while (v[k]-1&&key.v<h[v[k/2]].v)
	{
		h[v[k]]=h[v[k/2]];
		v[k]/=2;
	}
	h[v[k]]=key;
}
void cut(int k)
{
	h[v[k]]=h[v[n]];
	--n;
	if (v[k]-1&&h[v[k]].v<h[v[k/2]].v)
		urc(v[k]);
	else
		cobor(v[k]);
}
void insert(int x)
{
	h[++n].v=x;
	++nh;
	h[n].p=nh;
	v[n]=nh;
	urc(v[n]);
}
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);
			cut(c1);
			continue;
		}
		if (w==3)
		{
			printf("%d\n",h[1].v);
			continue;
		}
	}
}
int main()
{
	citire();
	return 0;
}