Cod sursa(job #3250584)

Utilizator elisa.ipateElisa Ipate elisa.ipate Data 22 octombrie 2024 11:43:16
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>

using namespace std;

#define nmax 200001
int elemArb = 0;

struct info{
    int val, x;
};

info arb[4 * nmax];
int v[nmax];

void update( int vf ) {
    v[arb[vf].x] = vf;
}

void push_jos( int vf ) {
    int fiu;
    if( 2 * vf > elemArb )
        return;
    if( 2 * vf + 1 > elemArb || arb[2 * vf].val < arb[2 * vf + 1].val )
        fiu = 2 * vf;
    else
        fiu = 2 * vf + 1;
    if( arb[fiu].val < arb[vf].val ) {
        swap( arb[fiu], arb[vf] );
        update( vf );
        update( fiu );
        push_jos( fiu );
    }
}

void push_sus( int vf ) {
    int tata;
    tata = vf / 2;
    if( tata == 0 )
        return;
    if( arb[tata].val > arb[vf].val ) {
        swap( arb[tata], arb[vf] );
        update( vf );
        update( tata );
        push_sus( tata );
    }
}

int main() {
    int nr, t, x, nrAdaugate = 0, vf;

    ifstream cin("heapuri.in");
    ofstream cout("heapuri.out");
    cin >> nr;
    for( int w = 0; w < nr; w++ ) {
        cin >> t;
        if( t == 1 ) {
            cin >> x;
            v[++nrAdaugate] = ++elemArb;
            arb[elemArb].val = x;
            arb[elemArb].x = nrAdaugate;
            push_sus( elemArb );
        } else if( t == 2 ) {
            cin >> x;
            vf = v[x];
            swap( arb[vf], arb[elemArb] );
            update( vf );
            elemArb--;
            push_sus( vf );
            push_jos( vf );
        } else{
            cout << arb[1].val << "\n";
        }
    }
    return 0;
}