Cod sursa(job #239108)

Utilizator ilincaSorescu Ilinca ilinca Data 4 ianuarie 2009 02:45:03
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 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 aux, f=k, min=a [h [k]];
	if ((k << 1) <= nr_h && a [h [k<<1]] < min)
	{
		min=a [h [k<<1]];
		f=k<<1;
	}
	if (((k << 1)|1) <= nr_h && a [h [(k<<1)|1]] < min)
	{
		min=a [h [(k<<1)|1]];
		f=(k<<1)|1;
	}
	if (f == k)
		return ;
	aux=h [k];
	h [k]=h [f];
	h [f]=aux;
	p [h [k]]=k;
	p [h [f]]=f;
	down (f);
}

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
			{
				h [p [x]]=h [nr_h];
				--nr_h;
				up (p [x]); 
				down (p [x]);
			}
		}
	}
	return 0;
}