Cod sursa(job #2013605)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 21 august 2017 20:46:02
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int sz,arb[200001],pozitie[200000];
void adauga( int val ){
    sz++;
    arb[sz] = val;
    pozitie[val] = sz;
    int poz = sz;
    while( poz > 1 && val < arb[poz/2] ){
        swap( pozitie[arb[poz]],pozitie[arb[poz/2]] );
        swap( arb[poz],arb[poz/2] );
        poz /= 2;
    }
    pozitie[val] = poz;
    return;
}
void sterge( int poz ){
    swap( pozitie[arb[sz]], pozitie[arb[poz]] );
    swap( arb[sz],arb[poz] );
    arb[sz] = 0;
    sz--;
    int val = arb[poz];
    while( poz > 1 && val < arb[poz/2]){
        swap( pozitie[arb[poz]],pozitie[arb[poz/2]] );
        swap( arb[poz],arb[poz/2] );
        poz /= 2;
    }
    while( poz*2 <= sz ){
        int aux = poz * 2;
        if( aux+1 <= sz && arb[aux+1] < arb[aux] )
            aux++;
        if( arb[poz] > arb[aux] ){
            swap( pozitie[arb[poz]], pozitie[arb[aux]] );
            swap( arb[poz], arb[aux] );
            poz = aux;
        }
        else{
            break;
        }
    }
    return;
}
int n,i,t,y,x,cron[200001],s;
int main(){
    in >> n;
    for( i = 1; i <= n; i ++ ){
        in >> t;
        if( t == 3 ){
            out<<arb[1]<<"\n";
        }
        if( t == 2 ){
            in >> x;
            sterge( pozitie[cron[ x ]] );
        }
        if( t == 1 ){
            in >> x;
            adauga( x );
            cron[++s] = x;
        }
    }
    return 0;
}