Cod sursa(job #2890525)

Utilizator RobertuRobert Udrea Robertu Data 15 aprilie 2022 20:39:33
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <fstream>
#include <unordered_map>
using namespace std;

const int dim = 200003;

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

int v[dim];              
int ordine[dim], o = 0;
unordered_map<int, int> umap;

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

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

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

    // umap[ key ] = umap[ v[nod] ];
    // 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, poz;

    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;
            umap[nod] = dim;
            goUp(v, dim, dim);
            
        } else if( op == 2 ) {
            //stergem   

            // for(int j = 1; j <= dim; j++)
            //     if( v[j] == ordine[nod] ) {
            //         poz = j;
            //         break;
            //     }

            v[ umap[ ordine[nod] ] ] = v[dim--];
            // if( nod > 1 && v[ umap[ ordine[nod] ] ] < v[ umap[ ordine[nod] ] / 2 ] )
                goUp(v, dim, umap[ ordine[nod] ]);
            // else {
                goDown(v, dim, umap[ ordine[nod] ]);
            // }
                
        } else {
            //afisam minimul
            fout << v[1] << '\n';
        }
    }

    return 0;
}