Cod sursa(job #662282)

Utilizator alexdmotocMotoc Alexandru alexdmotoc Data 16 ianuarie 2012 13:36:27
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

#define maxN 200005

int H[maxN] , pozH[maxN] , A[maxN] , dim , dim2 , N;

void push (int nod)
{
	int tata = nod / 2;
	
	if (nod == 1)
		return;
	
	if (A[H[nod]] >= A[H[tata]])
		return;
	
	swap (H[nod] , H[tata]);
	swap (nod , tata);
	
	push (tata);
}


void pop (int nod)
{
	int fiu1 , fiu2 , nodmin = nod;
	
	fiu1 = nod * 2;
	fiu2 = nod * 2 + 1;
	
	nodmin = nod;
	
	if (A[H[fiu1]] < A[H[nodmin]] && fiu1 <= dim)
		nodmin = fiu1;
	
	if (A[H[fiu2]] < A[H[nodmin]] && fiu2 <= dim)
		nodmin = fiu2;
	
	if (nodmin == nod)
		return;
	
	swap (nod , nodmin);
	swap (H[nod] , H[nodmin]);

	
	pop (nodmin);
}



void adaug (int x)
{
	A[++dim2] = x;
	
	pozH[++dim] = dim;
	H[dim] = dim2;
	
	push (pozH[dim]);
}

void sterge (int x)
{
	swap (pozH[H[x]] , pozH[H[dim]]);
	swap (H[x] , H[dim]);
	
	--dim;
	
	pop (pozH[H[x]]);
	push (pozH[H[x]]);
}



int main ()
{
	freopen ("heapuri.in" , "r" , stdin);
	freopen ("heapuri.out" , "w" , stdout);
	
	scanf ("%d" , &N);
	
	int x , cod;
	
	for (int t = 1 ; t <= N ; ++t)
	{
		scanf ("%d" , &cod);
		
		if (cod == 1)
		{
			scanf ("%d" , &x);
			
			adaug (x);
		}
		
		if (cod == 2)
		{
			scanf ("%d" , &x);
			
			sterge (x);
		}
		
		if (cod == 3)
			printf ("%d\n" , A[H[1]]);
	}
	
	return 0;
}