Cod sursa(job #431109)

Utilizator ooctavTuchila Octavian ooctav Data 31 martie 2010 18:01:14
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 200005;
int N, L = 0, NR = 0;
int A[NMAX];// A[i] retine valoarea elementului i
int Heap[NMAX];//Heap[i] retine elementul de pe pozitia i
int Poz[NMAX];//Poz[i] retine pozitia in heap a elementului i

void adauga(int x)
{
	for(int i = L; i ; i = i/2)
		if(i/2 && A[Heap[i]] < A[Heap[i/2]])
		{
			swap(Heap[i], Heap[i/2]);
			Poz[Heap[i]] = i/2;
			Poz[Heap[i/2]] = i;
		}
}

void aranjeaza(int x)
{
	int y = 0;
	while(x != y)
	{
		y = x;
		if(2 * y <= L && A[Heap[x]] > A[Heap[2 * y]])
			x = 2 * y;
		if(2 * y + 1 <= L && A[Heap[x]] > A[Heap[2 * y + 1]])
			x = 2 * y + 1;
		swap(Heap[x], Heap[y]);
		Poz[Heap[x]] = x;
		Poz[Heap[y]] = y;
	}
}

void rezolva()
{
	int iden, x;
	scanf("%d",&N);
	for(int i = 1 ; i <= N ; i++)
	{
		scanf("%d",&iden);
		if(iden != 3)
			scanf("%d",&x);
		
		if(iden == 1)
		{
			A[i] = x;
			Heap[++L] = i;
			Poz[i] = L;
			adauga(L);
		}
		if(iden == 2)
		{
			A[x] = -1;
			adauga(Poz[x]);
			Poz[Heap[1]] = 0;
			Heap[1] = Heap[L--];
			Poz[Heap[1]] = 1;
			if(L > 1)
				aranjeaza(1);
		}
		if(iden == 3)
			printf("%d\n",A[Heap[1]]);
	}
}

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