Cod sursa(job #548488)

Utilizator BitOneSAlexandru BitOne Data 7 martie 2011 14:50:30
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <cstdlib>
#define N_MAX 200011
#define oo 1<<20

using namespace std;
int lHeap;
int v[N_MAX], H[N_MAX], P[N_MAX];
inline void _swap( int& x, int& y ) { int aux=x; x=y; y=aux; }
inline int _min( int x, int y ) { return ( x <= y ? x : y ); }
inline int _max( int x, int y ) { return ( x >= y ? x : y ); }
inline void DownHeap( int k )
{
	for( int son=2*k; son <= lHeap; k=son, son=k*2 )
	{
		if( son < lHeap && v[H[son+1]] < v[H[son]] )
			++son;
		if( v[H[k]] <= v[H[son]] )
			return;
		_swap( H[k], H[son] );
		P[H[k]]=k;
		P[H[son]]=son;
	}
}
inline void UpHeap( int k )
{
	for( int key=v[H[k]], f=k/2; k > 1 && key < v[H[f]]; k=f, f/=2 )
	{
		_swap( H[k], H[f] );
		P[H[k]]=k;
		P[H[f]]=f;
	}
}
inline void pop( int x )
{
	P[H[lHeap]]=P[x];
	H[P[x]]=H[lHeap];
	--lHeap;
	DownHeap( P[x] );	
}
inline void push( int k )
{
	H[++lHeap]=k;
	P[k]=lHeap;
	UpHeap( lHeap );
}
int main( void )
{
	int N, i, j=0, op;
	ifstream in( "heapuri.in" );
	ofstream out( "heapuri.out" );
	v[0]=oo;
	for( in>>N; N; --N )
	{
		in>>op;
		switch(op)
		{
			case 1 : ++j; in>>v[j]; push(j); break;
			case 2 : in>>i; pop(i); break;
			case 3 : out<<v[H[1]]<<'\n'; break;
		}
	}
	return EXIT_SUCCESS;
}