Cod sursa(job #388623)

Utilizator BaduBadu Badu Badu Data 30 ianuarie 2010 15:58:32
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<fstream>
#define max 200001

using namespace std;

long long n,dim,nr;
long long h[max];
long long p[max];
long long v[max];

void swap(long long &a, long long &b){
	long long aux=a;
	a = b;
	b = aux;
}

void down(int x){
	
	long long fs,fd;
	
	while(1){
		
		fs = 2*x;
		if( fs > dim ) break;
		fd = 2*x + 1;
		if( fd <= dim && v[ h[fd] ] <= v[ h[fs] ] ) fs=fd;
		if( v[ h[fs] ] >= v[ h[x] ] ) break;
		swap ( h[fs], h[x] );
		p [ h[fs] ] = fs;
		p [ h[x]  ] = x ;
		
		x=fs;
		
	}
}

void up(long long poz){
	
	long long tata=poz>>1;
 	long long x = h[poz];
	
	while( poz>1 && v[ x ] < v [ h[tata] ] ){
		
		swap( h[poz], h[tata] );
			
		p [ h[poz] ] = poz;
		p [ h[tata]  ] = tata ;
		
		poz = tata;
		tata >>=1;
	}
}

void add( int x ){
	
	v[++nr] = x;
	p[nr]=nr;
	h[++dim]=nr;

	up(dim);
	
}

void del( int x ){
	
	swap( h[ p[x] ], h[dim] );
	p[ h[dim] ] = p[x];
	--dim;
	
	down(p[x]);
	
}


int main(){
	
		ifstream f("heapuri.in");
		ofstream g("heapuri.out");
		
		int o,x;
		f>>n;
		
		for( ; n ; --n ){
			
			f>>o;
			
			if ( o <=2 ){
				
				if( o==1 ) { 
					f>>x;
					add(x);continue; }
				else if( o==2 ) { 
					f>>x; 
					del(x);continue; }
				
			}
			
			g<<v[h[1]]<<'\n';
			
		}
			
	return 0;
}