Cod sursa(job #1430813)

Utilizator CalinCojoFMI Cojocaru Calin George CalinCojo Data 8 mai 2015 20:49:14
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

const int MAX = 200002;

vector <int> HEAP, POS, L ;

/*
EL.resize ( MAX + 1 );
HEAP.push_back (0);
POS.push_back (0);
NTH_EL.push_back (0);
*/


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

void mySwap ( int &i ,int j){
    swap ( HEAP [ i ] , HEAP [ j ] ) ;
    swap ( L [ i ] , L [ j ] ) ;
    swap ( POS [ L [ i ] ] , POS [ L [ j ] ] );
    i = j;
}

template <class T>
void pushHP ( T el){

    HEAP.push_back(el);
    int i = HEAP.size() - 1;
    int POS_aux, NTH_aux;

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

void HPdown ( int i ){

    bool FINHP = 0;
    int j ;
    while ( !FINHP && 2*i < HEAP.size() ){

        FINHP = 1;

        if ( HEAP [ i ] > HEAP [2*i ] ){
            j = 2*i;
            FINHP = 0;
        }

        if ( 2*i+ 1 <HEAP.size() && HEAP [ i ] > HEAP [2*i + 1 ] && HEAP [ 2*i + 1] < HEAP [ 2*i ] ){
            j = 2*i + 1;
            FINHP = 0;
        }

        if( !FINHP ){
            mySwap( i , j);
        }


    }
}

template <class T>
void delHP( T poz ){

    int i = HEAP.size() - 1;
    int x = POS [ poz ];
    mySwap ( i , POS [ poz ] ) ;
    HEAP.pop_back();
    HPdown( x );
}

int main(){

    int n , x, y;
    HEAP.push_back( 0 );
    POS.push_back ( 0 );
    L.push_back( 0 );
    f>>n;
    while (n--){

        f>>x;
        if(x == 1){
            f>>y;
            POS.push_back ( POS.size() );
            L.push_back( L.size() );
            pushHP ( y );
        }
        if( x == 2){
            f>>y;
            delHP ( y );
        }
        if( x== 3)
            minHP();
    }
}