Cod sursa(job #615668)

Utilizator BitOneSAlexandru BitOne Data 10 octombrie 2011 15:20:13
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <cstdlib>
#define N_MAX 200011

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; }
void DownHeap( int k )
{
	for( int son=k<<1; son <= lHeap; k=son, son<<=1 )
	{
		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;
	}
}
void UpHeap( int k )
{
	for( int key=v[H[k]], f=k>>1; k && key < v[H[f]]; k=f, f>>=1 )
	{
		_swap( H[k], H[f] );
		P[H[k]]=k;
		P[H[f]]=f;
	}
}
inline void push( int x )
{
	H[++lHeap]=x;
	P[x]=lHeap;
	UpHeap( lHeap );
}
inline void pop( int x )
{
	H[P[x]]=H[lHeap];
	P[H[lHeap]]=P[x];
	--lHeap;
	DownHeap( P[x] );
}
int main( void )
{
	int N, i, op, x;
	ifstream in( "heapuri.in" );
	ofstream out( "heapuri.out" );
	for( i=0, in>>N; N; --N )
	{
		in>>op;
		switch(op)
		{
			case 1 : in>>x; v[++i]=x; push(i); break;
			case 2 : in>>x; pop(x); break;
			case 3 : out<<v[H[1]]<<'\n';
		}
	}
	return EXIT_SUCCESS;
}