Cod sursa(job #652641)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 25 decembrie 2011 16:33:23
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>
#include <assert.h>

#define manrn 200010

int n, L, m;
int A[manrn], heap[manrn], poz[manrn];

void push(int nr)
{
	int aunr;

	while (nr/2 && A[heap[nr]]<A[heap[nr/2]])
	{
		aunr = heap[nr];
		heap[nr] = heap[nr/2];
		heap[nr/2] = aunr;

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

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

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

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

		aunr = heap[nr];
		heap[nr] = heap[y];
		heap[y] = aunr;

		poz[heap[nr]] = nr;
		poz[heap[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++;
			A[n] = nr;
			heap[L] = n;
			poz[n] = L;
			push(L);
		}
		if (op == 2)
		{
			A[nr] = -1;
			assert(poz[nr] != 0);
			assert(1<=nr && nr<=n);
			push(poz[nr]);
			
			poz[heap[1]] = 0;
			heap[1] = heap[L--];
			poz[heap[1]] = 1;
			if (L>1) pop(1);
		}
		if (op == 3) printf("%d\n", A[heap[1]]);
	}
return 0;}