Pagini recente » Cod sursa (job #1215140) | Cod sursa (job #2142233) | Cod sursa (job #552043) | Cod sursa (job #2414242) | Cod sursa (job #633527)
Cod sursa(job #633527)
#include <cstdio>
#define MAX_N 200010
#define fs( x ) ( x ) * 2
#define fd( x ) ( x ) * 2 + 1
#define t( x ) ( x ) / 2
int heap[ MAX_N ], poz[ MAX_N ], nrOp, op, x, N, L, val[ MAX_N ];
void swap( int x, int y ){
int aux = heap[ x ];
heap[ x ] = heap[ y ];
heap[ y ] = aux;
}
void up_heap( int node ){
while( node > 1 && val[ heap[ node ] ] < val[ heap[ t( node ) ] ] ){
swap( node, t( node ) );
poz[ heap[ node ] ] = node;
poz[ heap[ t( node ) ] ] = t( node );
node = t( node );
}
}
void down_heap( int node ){
while( ( fs( node ) <= N && val[ heap[ fs( node ) ] ] < val[ heap[ node ] ] ) ||
( fd( node ) <= N && val[ heap[ fd( node ) ] ] < val[ heap[ node ] ] ) )
if( fd( node ) <= N ){
if( val[ heap[ fs( node ) ] ] < val[ heap[ fd( node ) ] ] ){
swap( node, fs( node ) );
poz[ heap[ node ] ] = node;
poz[ heap[ fs( node ) ] ] = fs( node );
node = fs( node );
}
else{
swap( node, fd( node ) );
poz[ heap[ node ] ] = node;
poz[ heap[ fd( node ) ] ] = fd( node );
node = fd( node );
}
}
else{
swap( node, fs( node ) );
poz[ heap[ node ] ] = node;
poz[ heap[ fs( node ) ] ] = fs( node );
node = fs( node );
}
}
void add( int x )
{
val[ ++L ] = x;
heap[ ++N ] = L;
poz[ L ] = N;
up_heap( N );
}
void erase( int x )
{
val[ x ] = -1;
up_heap( poz[ x ] );
poz[ heap[ 1 ] ] = 0;
heap[ 1 ] = heap[ N-- ];
poz[ heap[ 1 ] ] = 1;
if( N > 1 )
down_heap( 1 );
}
int main()
{
freopen( "heapuri.in", "r", stdin );
freopen( "heapuri.out", "w", stdout );
scanf("%d",&nrOp);
for( ; nrOp; nrOp-- )
{
scanf( "%d", &op );
if( op == 1 )
{
scanf( "%d", &x );
add( x );
}
if( op == 2 )
{
scanf( "%d", &x );
erase( x );
}
if( op == 3 )
printf( "%d\n", val [ heap[ 1 ] ] );
}
fclose( stdin );
fclose( stdout );
return 0;
}