Cod sursa(job #854774)

Utilizator bogdan93Grigorescu Bogdan bogdan93 Data 13 ianuarie 2013 23:26:14
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <stdio.h>
#include <stdlib.h>

#define nmax 200000

int N , heap [ nmax ] , op , x , nr ;
int poz [ nmax ] ;

void swap ( int &a , int &b )
{
    int aux = a ;
    a = b ;
    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 ) ;
        }
    }
}

void cauta ( int x , int nod )
{
    if ( nod <= nr )
        if ( x == heap [ nod ] )
            {
                swap ( heap [ nod ] , heap [ nr ] ) ;
                nr-- ;
                downheap ( nod ) ;
            }
            else
            {
                cauta ( x , 2 * nod ) ;
                cauta ( x , 2 * nod + 1 ) ;
            }
        else return ;

}

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 ;
            upheap ( nr ) ;
            poz [ j++ ] = x ;
            continue ;
        }
        if ( op == 2 )
        {
            fscanf ( fin , "%d" , &x ) ;
            cauta ( poz [ x ] , 1 ) ;
            continue ;

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

    }

    fclose ( fin ) ;
    fclose ( fout ) ;
    return 0 ;

}