Cod sursa(job #854984)

Utilizator bogdan93Grigorescu Bogdan bogdan93 Data 14 ianuarie 2013 15:11:35
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <stdio.h>
#include <stdlib.h>

#define nmax 200001

int N , heap [ nmax ] , op , x , nr , aaa ;
int poz [ 5 * nmax ] , time [ nmax ]  ;

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

}

void upheap ( int k )
{
    if ( k / 2 >= 1 )
        if ( heap [ k / 2 ] > heap [ k ] )
        {
            swap ( heap [ k / 2 ] , heap [ k ] ) ;
            upheap ( k / 2 ) ;
        }
}
void downheap ( int k )
{
    if ( 2 * k <= nr )
    {
        int min = 2 * k ;
        if ( 2 * k + 1 <= nr && heap [ 2 * k + 1 ] < heap [ 2 * k ] )
            min = 2 * k + 1 ;
        if ( heap [ min ] < heap [ k ] )
        {
            swap ( heap [ k ] , heap [ min ] ) ;
            downheap ( min ) ;
        }
    }
}

int main ()
{
    FILE *fin , *fout ;

    fin = fopen ( "heapuri.in" , "rt" ) ;
    fout = fopen ( "heapuri.out" , "wt" ) ;
    int j = 1 ;
    fscanf ( fin , "%d " , &N ) ;
    for ( int i = 1 ; i <= N ; i++ )
    {

        fscanf ( fin , "%d" , &op ) ;
        if ( op == 1 )
        {
            fscanf ( fin , "%d" , &x ) ;
            nr++ ;
            heap [ nr ] = x ;
            time [ j ] = x ;
            poz [ x ] = nr ;
            j++ ;
            upheap ( nr ) ;

            continue ;
        }
        if ( op == 2 )
        {
            fscanf ( fin , "%d" , &x ) ;
            aaa = heap [ nr ] ;
            swap ( heap [ nr ] , heap [ poz [ time [ x ] ] ] ) ;
            nr-- ;
            downheap ( poz [ aaa ]  ) ;
            continue ;

        }
        fprintf ( fout , "%d\n" , heap [ 1 ] ) ;

    }

    fclose ( fin ) ;
    fclose ( fout ) ;

    return 0 ;

}