Cod sursa(job #236220)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 26 decembrie 2008 22:52:30
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
using namespace std;
#define MAX 300000

int Heap[MAX], Pos[MAX], Val[MAX];
int N, count, heap_count, code, val;

void swap( int &x, int &y ) {
	int p = x; x = y; y = p;
}

void push( int p ) {
	if ( p==0 ) return ;

	int t = (p-1) / 2;
	if ( Val[Heap[p]] < Val[Heap[t]] ) {
		swap( Pos[Heap[p]], Pos[Heap[t]] );
		swap( Heap[p], Heap[t] );
		push( t );
	}
}

void pop( int p ) {
	if ( p > heap_count ) return;

	int f1 = 2*p + 1, f2 = 2*p + 2, x;
	if ( f1>heap_count ) return ;
	if ( f2 > heap_count ) {
        swap( Pos[Heap[p]], Pos[Heap[f1]] );
		swap( Heap[p], Heap[f1] );
	} else {
		x = ( Val[Heap[f1]] < Val[Heap[f2]] ) ? f1 : f2;
		swap( Pos[Heap[x]], Pos[Heap[p]] );
		swap( Heap[x], Heap[p] );
		pop( x );
	}
}

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

	scanf( "%d", &N );
	heap_count = -1;
	while ( N-- ) {
		scanf( "%d", &code );
		switch ( code ) {
			case 1:
				scanf( "%d", &val );
				++ count;
				Val[ count ] = val;
				heap_count ++;
				Pos[ count ] = heap_count;
				Heap[ heap_count ] = count;
				push( heap_count );
				break;
			case 2:
				scanf( "%d", &val );
				pop( Pos[val] );
				Pos[ heap_count ] = Pos[val];
				Heap[ Pos[val] ] = Heap[ heap_count ];

				heap_count --;
				break;
			case 3:
				printf( "%d\n", Val[Heap[0]] );
				break;
		}
	}
	return 0;
}