Cod sursa(job #239103)

Utilizator ilincaSorescu Ilinca ilinca Data 4 ianuarie 2009 02:21:35
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#include <vector>

int n, nr_h, nr_i, h [200005], a [200005], p [200005];


void up (int k)
{
	int aux;
	while (k >1 && a [h [k]] < a [h [k>>1]]) 
	{
		aux=h [k];
		h [k]=h [k>>1];
		h [k>>1]=aux;
		p [h [k]]=k;
		p [h [k>>1]]=k>>1;
		k>>=1;
	}
}

/*void down (int k)
{
	int f, aux;
	do
	{
		if (k<<1 <= nr_h)
		{
			f=k<<1;
			if (f+1 <= nr_h && a [h [(k<<1)|1]] < a [h [f]])
				f|=1;
			if (a [h [k]] > a [h [f]])
			{
				p [h [k]]=k;
				p [h [f]]=f;
				aux=h [k];
				h [k]=h [f];
				h [f]=aux;
			}
			else 
				f=0;	
		}
		else
			f=0;
	} while (f);
}*/
void down (int k)
{
	int minv=a[h[k]],poz=k;
	if ((k<<1) <=nr_h&&a[h[k<<1]]<minv) // verifca fiul stang
	{
		minv=a[h[k<<1]];
		poz=k<<1;
	}
	if ((k<<1)+1<=nr_h&&a[h[(k<<1)+1]]<minv) // verifca fiul drept
	{
		minv=a[h[(k<<1)+1]];
		poz=(k<<1)+1;
	}
	if (poz==k)
		return ;
	//swapeaza
	int aux=h[k];
	h[k]=h[poz];
	h[poz]=aux;
	p[h[k]]=k;
	p[h[poz]]=poz;
	down(poz);
}

int main ()
{
	freopen ("heapuri.in", "r", stdin);
	freopen ("heapuri.out", "w", stdout);
	int i, tip, x;
	scanf ("%d", &n);
	for (i=1; i<=n; ++i)
	{
		scanf ("%d", &tip);
		if (tip == 3)
			printf ("%d\n", a [h [1]]);
		else
		{
			scanf ("%d", &x);
			if (tip == 1)
			{
				++nr_h; ++nr_i;
				h [nr_h]=nr_i;
				a [nr_i]=x;
				p [nr_i]=nr_h;
				up (nr_h);
			}
			else
			{
				//a [x]=-1;
				h [p [x]]=h [nr_h];
				--nr_h;
				up (p [x]);
				down (p [x]);
				//p [x]=-1;
			}
		}
	}
	return 0;
}