Cod sursa(job #1430905)

Utilizator CalinCojoFMI Cojocaru Calin George CalinCojo Data 8 mai 2015 21:56:14
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
using namespace std;


ifstream f( "heapuri.in" ,ios::in);
ofstream g ("heapuri.out" ,ios::out);

const int MAX = 200002;

int HEAP [MAX] , POS [ MAX ] ,L[ MAX ] ,sz;

void mySwap ( int &i ,int j){
    int aux ;
    aux = HEAP [ i ];
    HEAP [ i ] = HEAP [ j ];
    HEAP  [ j ] = aux;

    aux = L [ i ];
    L [ i ] = L [ j ];
    L [ j ] = aux ;

    aux = POS [ L [ i ] ];
    POS [ L [ i ] ] = POS [ L[ j ] ];
    POS [  L [ j ] ] = aux;

    i = j;

}

void upHEAP( int &i ){

    while ( i > 1 && HEAP [ i ] < HEAP [ i/2 ] ){
        mySwap( i, i/2 );
    }

}

void downHEAP ( int &i){

    bool FINHEAPED = 0;
    int j;

    while ( !FINHEAPED && 2*i <= sz ){

        FINHEAPED = 1;
        if ( HEAP [ i ] > HEAP [ 2*i ] ){
            FINHEAPED = 0;
            j = 2*i;
        }
       if ( 2*i + 1 <= sz && HEAP [ i ] > HEAP [ 2*i + 1 ] && HEAP [ 2*i+1 ] < HEAP [ 2*i + 1 ] ){
            FINHEAPED = 0;
            j = 2*i + 1;
        }
        if(!FINHEAPED){
            mySwap( i , j );
        }

    }
}

void insertHP ( int h ){
    HEAP [ ++sz ] = h;
    int i = sz ;
    upHEAP( i );
}

void show(){
    g<<HEAP [ 1 ]<<"\n";
}

void deleteHP ( int poz ){

    int i = POS [ poz ];
    int j = i;
    mySwap( i , sz );
    sz--;
    upHEAP( j );
    downHEAP( j );

}

int main()
{
    int n,x,y;
    f>>n;
    while (n--){

        f>>x;
        if(x == 1){
            f>>y;
            POS [ sz + 1 ] = sz + 1;
            L [ sz + 1 ]  = sz + 1;
            insertHP ( y );
        }
        if( x == 2){
            f>>y;
            deleteHP( y ) ;
        }
        if( x== 3)
            show();
    }

    return 0;
}