Cod sursa(job #234341)

Utilizator devilkindSavin Tiberiu devilkind Data 20 decembrie 2008 18:40:34
Problema Heapuri Scor Ascuns
Compilator cpp Status done
Runda Marime 1.22 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define NMAX 200000
#define mp make_pair
#define ff first
#define ss second
#define mp make_pair

int NRI[NMAX];
pair<int, int> H[NMAX];
int N, dimh, cnt;

void push_up(int nod)
{
	for (;H[nod / 2] > H[nod]; nod /= 2)
	{
		swap(H[nod], H[nod / 2]);
		
		NRI[ H[nod].ss ] = nod;
		NRI[ H[nod / 2].ss ] = nod / 2;
	}
}

void push_down(int nod)
{
	int mn;

	mn = nod;
	if (nod * 2 <= dimh && H[nod * 2] < H[mn]) mn = nod * 2;
	if (nod * 2 + 1 <= dimh && H[nod * 2 + 1] < H[mn]) mn = nod * 2 + 1;

	if (mn != nod)
	{
		swap(H[nod], H[mn]);
		
		NRI[ H[nod].ss ] = nod;
		NRI[ H[mn].ss ] = mn;
		
		push_down(mn);
	}
}

void adauga()
{
	int x;
	scanf("%d ", &x);

	NRI[++cnt] = ++dimh;
	H[dimh] = mp(x, cnt);

	push_up(dimh);
}

void sterge()
{
	int x, P;
	scanf("%d ", &x);

	P = NRI[x];

	swap(H[P], H[dimh]);
	NRI[ H[P].ss ] = P;
	dimh--;

	if (P > 1 && H[ P/2 ] < H[P]) push_up(P);
		else push_down(P);
}

int main()
{
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);

	int i, cd;

	scanf("%d ", &N);

	for (i = 1; i <= N; i++)
	{
		scanf("%d ", &cd);

		if (cd == 1) adauga();
		if (cd == 2) sterge();
		if (cd == 3) printf("%d\n", H[1].ff);
	}

	return 0;
}