Cod sursa(job #1430796)

Utilizator CalinCojoFMI Cojocaru Calin George CalinCojo Data 8 mai 2015 20:21:05
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 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, EL ;
/*
EL.resize ( MAX + 1 );
HEAP.push_back (0);
POS.push_back (0);
NTH_EL.push_back (0);
*/


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

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] ){
        swap ( POS [ EL [ HEAP [ i ] ] ] , POS [ EL [ HEAP [ i/2 ] ] ]);
        swap ( HEAP [ i ] , HEAP [ i/2 ] );
        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 ){
        swap ( POS [ EL [ HEAP [ i ] ] ] , POS [ EL [ HEAP [ j ] ] ]);
        swap ( HEAP [ i ] , HEAP [ j ] );
         i = j;

        }


    }
}

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

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

int main(){

    int n , x, y;
    HEAP.push_back( 0 );
    POS.push_back ( 0 );
    EL.resize ( MAX + 1);
    f>>n;
    while (n--){

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