Mai intai trebuie sa te autentifici.

Cod sursa(job #751314)

Utilizator joli94Apostol Adrian Alexandru joli94 Data 25 mai 2012 16:35:39
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<cstdio>

const int N = 1<<19;

int h[N] , poz[N] , v[N] ;

void swap(int a,int b)
{
	int aux = h[a];
	h[a] = h[b];
	h[b] = aux;
	poz[h[a]] = a;
	poz[h[b]] = b;
}

void up ( int p) {
	while ( p>1 && v[h[p]] < v[h[p/2]] ) {
		swap ( p , p/2 ) ;
		p /= 2 ;
	}
}

void down ( int p )
{
	int fs = 2*p , fd = 2*p+1 , optim = p ;
	if ( fs <= h[0] && v[h[fs]] < v[h[optim]]) optim = fs;
	if ( fd <= h[0] && v[h[fd]] < v[h[optim]]) optim = fd;
	if ( optim != p )
	{
		swap ( p , optim ) ;
		down ( optim ) ;
	}
}

void add ( int val ) {
	h[++h[0]] = val ;
	poz[val] = h[0];
	up ( h[0] ) ;
}

void del ( int p) {
	swap ( p , h[0] ) ;
	-- h[0] ;
	up ( p ) ;
	down ( p ) ;
}

int main() {
	freopen ( "heapuri.in" , "r" , stdin ) ;
	freopen ( "heapuri.out" , "w" , stdout ) ;
	
	int n , cod , x ; 
	
	scanf ( "%d" , &n ) ;
	
	for ( int i=1 ; i<=n ; ++i )
	{
		scanf ( "%d" , &cod ) ;
		
		if ( cod == 1 ) 
		{
			scanf ( "%d" , &v[++v[0]] ) ;
			add ( v[0] ) ;
			
		}
		
		if ( cod == 2 )
		{
			scanf ( "%d" , &x ) ;
			del ( poz[x] ) ;
		}
		
		if ( cod == 3 )
			printf ( "%d\n" , v[h[1]] ) ;
	}
	return 0;
	}