Cod sursa(job #1149610)

Utilizator felixiPuscasu Felix felixi Data 22 martie 2014 09:21:40
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>

using namespace std;

ifstream in("heapuri.in");
ofstream out("heapuri.out");

const int NMAX = 200000;

int H[NMAX+1], a[NMAX+1], p[NMAX+1];
int N, nr_e, nr_i;

void schimba( int a, int b )
{
    int aux;
    aux= H[b];
    H[b]= H[a];
    H[a]= aux;
    p[ H[a] ]= a;
    p[ H[b] ]= b;
}

void plaseaza_sus( int poz ) {
    int tata= poz/2;
    if ( tata > 0 ) {
        if ( a[ H[tata] ] > a[ H[poz] ] )
        {
            schimba( tata, poz );
            plaseaza_sus( tata );
        }
    }
}

void plaseaza_jos( int poz ) {
    int fiu= poz*2;
    if ( fiu <= nr_e ) {
        if ( fiu+1 <= nr_e ) {
            if ( a[ H[fiu+1] ] < a[ H[fiu] ] ) fiu++;
        }
        if ( a[ H[fiu] ] < a[ H[poz] ] )
        {
            schimba( fiu , poz );
            plaseaza_jos( fiu );
        }
    }
}



void operatie_1() {
    int x;
    in >> x;
    a[ ++nr_i ]= x;
    p[ nr_i ]= nr_e;
    H[ ++nr_e ]= nr_i;
    plaseaza_sus( nr_e );
}

void operatie_2() {
    int y,x;
    in >> x;
    y= p[x];
    schimba( p[x], nr_e );
    --nr_e;
    plaseaza_jos( y );
}

void operatie_3() {
     out << a[ H[1] ];
     out << '\n';
}

int main() {
    in >> N;
    for( int i= 0;  i<N;  i++ ) {
        int op;
        in >> op;
        if( op == 1 ) operatie_1();
        else if( op == 2 ) operatie_2();
        else operatie_3();
    }
    return 0;
}