Mai intai trebuie sa te autentifici.
Cod sursa(job #751314)
Utilizator | 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;
}