Cod sursa(job #236401)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 27 decembrie 2008 13:45:29
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdio.h>

#define MAX 200005

int N, K, poz[MAX], heap[MAX], v[MAX], nr;

void swap(int x, int y)
{
	int a;
	a = heap[x]; heap[x] = heap[y]; heap[y] = a;
}

void urc(int k)
{
	if (k > 1)
		if (v[ heap[k] ] < v[ heap[k / 2] ])
		{			
			poz[ heap[k] ] = k / 2;	poz[ heap[k / 2] ] = k;
			swap(k, k / 2);
			urc(k / 2);
		}
}

void cobor(int k)
{
	int min, st, dr;
	st = 2 * k; dr = st + 1;

	min = k;
	if (st <= K) {if (v[ heap[k] ] > v[ heap[st] ]) min = st;}
	if (dr <= K) {if (v[ heap[min] ] > v[ heap[dr] ]) min = dr;}

	poz[ heap[k] ] = min;	poz[ heap[min] ] = k;
	swap(k, min);
	if (min != k) cobor(min);
}

void sterg(int k)
{
	poz[ heap[k] ] = K;	poz[ heap[K] ] = k;
	swap(k, K);
	K--;
	cobor(k);
}




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

	int i, op, x;

	scanf("%d", &N);
	for (i = 1; i <= N; i++)
	{
		scanf("%d",&op);
		switch (op)
		{
		case 1:
			{
				scanf("%d", &v[++nr]);
				K++;
				heap[K] = nr; poz[nr] = K;
				urc(K);
				break;
			}
		case 2:
			{
				scanf("%d", &x);
				sterg(poz[x]);
				break;
			}
		case 3: 
			{
				printf("%d\n",v[ heap[1] ]);
				break;
			}
		}
	}
	return 0;
}