Cod sursa(job #652642)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 25 decembrie 2011 16:41:43
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#define mvnrn 200010
using namespace std;
int n, L, m;
int v[mvnrn], hevp[mvnrn], poz[mvnrn];

void push(int nr)
{
	int vunr;

	while (nr/2 && v[hevp[nr]]<v[hevp[nr/2]])
	{
		vunr = hevp[nr];
		hevp[nr] = hevp[nr/2];
		hevp[nr/2] = vunr;

		poz[hevp[nr]] = nr;
		poz[hevp[nr/2]] = nr/2;
		nr /= 2;
	}
}

void pop(int nr)
{
	int vunr, y = 0;

	while (nr != y)
	{
		y = nr;

		if (y*2<=L &&   v[hevp[nr]]>v[hevp[y*2]]) nr = y*2;
		if (y*2+1<=L && v[hevp[nr]]>v[hevp[y*2+1]]) nr = y*2+1;

		vunr = hevp[nr];
		hevp[nr] = hevp[y];
		hevp[y] = vunr;

		poz[hevp[nr]] = nr;
		poz[hevp[y]] = y;
	}
}

int main()
{
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);
	int i, nr, op;
	scanf("%d ", &m);
	for (i=1; i<=m; i++)
	{
		scanf("%d ", &op);
		if (op<3)  scanf("%d ", &nr);

		if (op==1)
		{
			L++, n++;
			v[n] = nr;
			hevp[L] = n;
			poz[n] = L;
			push(L);
		}
		if (op == 2)
		{
			v[nr] = -1;
			push(poz[nr]);
			
			poz[hevp[1]] = 0;
			hevp[1] = hevp[L--];
			poz[hevp[1]] = 1;
			if (L>1) pop(1);
		}
		if (op == 3) printf("%d\n", v[hevp[1]]);
	}
return 0;}