Cod sursa(job #633527)

Utilizator irene_mFMI Irina Iancu irene_m Data 13 noiembrie 2011 22:59:38
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.44 kb
#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;
}