Cod sursa(job #2890302)

Utilizator RobertuRobert Udrea Robertu Data 15 aprilie 2022 11:35:30
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>
using namespace std;

const int dim = 400003;

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

int v[dim];             //reprezinta Heap-ul
int ordine[200003], o = 0;
int pozitie[1000000002];

void swap(int a, int b) {
    int aux = v[a];
    v[a] = v[b];
    v[b] = aux;
}

void goUp(int v[], int dim, int nod) {
    int key = v[nod];

    while( nod > 1 && key < v[ nod / 2 ] ) {
        v[nod] = v[ nod / 2 ];
        nod /= 2;
    }

    v[nod] = key;
}

void goDown(int v[], int dim, int nod) {
    int son;

    do {
        son = 0;

        if( nod * 2 <= dim ) {
            son = nod * 2;

            if( nod * 2 + 1 <= dim && v[nod * 2 + 1] < v[son] )
                son = nod * 2 + 1;

            if( v[son] >= v[nod] )
                son = 0;
        }

        if( son ) {
            swap(son, nod);
            nod = son;
        }

    } while( son );
}

int main() {
    int n, op, nod, dim = 0;

    fin >> n;
    for(int i = 0; i < n; i++) {
        fin >> op;
        if( op != 3 ) fin >> nod;

        if( op == 1 ) {
            //inseram
            v[++dim] = nod;
            ordine[++o] = nod;
            goUp(v, dim, dim);

            for(int j = 1; j <= dim; j++) 
                pozitie[ v[j] ] = j;
            
        } else if( op == 2 ) {
            //stergem   
            v[pozitie[ ordine[nod] ]] = v[dim--];
            if( nod > 1 && v[ pozitie[ ordine[nod] ] ] < v[ pozitie[ ordine[nod] ] / 2] )
                goUp(v, dim, pozitie[ ordine[nod] ]);
            else 
                goDown(v, dim, pozitie[ ordine[nod] ]);

                for(int j = 1; j <= dim; j++) 
                    pozitie[ v[j] ] = j;
        } else {
            //afisam minimul
            fout << v[1] << '\n';
        }

        // fout << "Pasul " << i + 1 << ": ";
        // for(int j = 1; j <= dim; j++) 
        //     fout << v[j] << " ";
        // fout << '\n';
    }

    return 0;
}