Cod sursa(job #710433)

Utilizator lunat1cHobinca Bogdan lunat1c Data 9 martie 2012 17:39:36
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>

using namespace std;

int n, heap[100000001], ord[100000001], k, m;

inline int tata(int n)
{
	return n>>1;
}

void percolate(int nr, int m)
{
	while(heap[tata(m)]>nr && m>1)
	{
		heap[m]=heap[tata(m)];
		m/=2;
	}
	heap[m]=nr;
}

void sift(int nr, int m)
{
	int fiu, temp;
	do
	{
		fiu=0;
		if(nr*2<=m) fiu=nr*2;
		if(nr*2+1<=m && heap[nr*2+1]<heap[nr*2]) fiu=nr*2+1;
		if(heap[fiu]>heap[nr]) fiu=0;

		if(fiu)
		{
			temp=heap[fiu];
			heap[fiu]=heap[nr];
			heap[nr]=temp;
			nr=fiu;
		}
	}while(fiu);

}

int cautare(int nr, int nod)
{
	for(int i=1; i<=m; i++)
		if(nr==heap[i])
			return i;
}

void stergere(int nod, int &m)
{
	heap[nod]=heap[m];
	m--;
	if (nod > 1 && heap[tata(nod)]>heap[nod])
		percolate(heap[nod], m);
	else
		sift(nod, m);
}

void prelucr()
{
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%d", &n);
	int t,nr;
	while(n)
	{
		n--;
		scanf("%d", &t);
		switch(t)
		{
			case 1:
				{
					scanf("%d", &nr);
					heap[++m]=nr;
					percolate(nr, m);
					ord[++k]=nr;
					break;
				}
			case 2:
				{
					scanf("%d", &nr);
					nr=ord[nr];
					stergere(cautare(nr, 1), m);
					break;
				}
			case 3:
					printf("%d\n", heap[1]);
		}
	}
}

int main()
{
	prelucr();
    return 0;
}