Cod sursa(job #846634)

Utilizator bogdan93Grigorescu Bogdan bogdan93 Data 2 ianuarie 2013 15:56:55
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <stdio.h>
#include <stdlib.h>

int heap[200000] , ordine[200000] , n , i;
int op , k , ord , a , nr = 0 ;

void swap ( int &a , int &b )
{
    int aux;
    aux = a;
    a = b;
    b = aux;
}
void down ( int k )
{
    if ( k < nr )
        if ( heap[k] > heap[2<<k] && 2<<k <= nr )
        {
            swap ( heap[k] , heap[2<<k] );
            down ( 2<<k );
        }
        else if ( heap[k] > heap[2<<k+1] && 2<<k+1 <= nr )
        {
            swap ( heap[k] , heap[2<<k+1] );
            down ( 2<<k + 1 );
        }

}
void up ( int i )
{
    if ( i > 1 )
        if ( heap[i] < heap [i>>2] )
            {
                swap ( heap[i] , heap[i>>2] );
                up ( i>>2 );
            }
            else return;
        else return;
}

void caut ( int x , int i )
{
    if ( i > nr ) return;
    if ( ordine[x] == heap[i] ) a = i ;
        else
        {
            caut ( x , i<<2 );
            caut ( x , i<<2 + 1 );
        }
}

int main ()
{
    FILE *fin , *fout;
    fin = fopen ( "heapuri.in" , "rt" );
    fout = fopen ( "heapuri.out" , "wt" ) ;

    fscanf ( fin , "%d" , &n );

    for ( int i = 1 ; i <= n ; i++ )
    {
        fscanf ( fin , " %d " , &op );
        if ( op == 1 )
            {
                fscanf ( fin , "%d" , &k );
                nr++;
                heap[nr] = k;
                up ( nr );
                ord++;
                ordine[ord] = k;
                continue;
            }
        if ( op == 2 )
        {
            fscanf ( fin , "%d" , &k );
            caut ( k , 1 );
            swap ( heap[nr] , heap[a] );
            nr--;
            down ( 1 );

            continue;
        }
        printf ( "%d\n" , heap[1] );
    }
    fclose ( fin );
    fclose ( fout );
    return 0 ;
}