Cod sursa(job #2716078)

Utilizator George_CristianGeorge Dan-Cristian George_Cristian Data 4 martie 2021 18:07:55
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>

using namespace std;

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

#define NMAX 200005
#define VMAX 1000000005

int nrop, n, poz[NMAX], v[NMAX], heap[NMAX], nre;

void actualizare_sus(int p) {
    if (p == 1)
        return;
    if (v[heap[p / 2]] > v[heap[p]]) {
        swap(poz[heap[p / 2]], poz[heap[p]]);
        swap(heap[p / 2], heap[p]);
        actualizare_sus(p / 2);
    }
}

void actualizare_jos(int p) {
    int dir = -1, mini = VMAX;
    if (2 * p <= nre && v[heap[p]] > v[heap[2 * p]]) {
        dir = 2 * p;
        mini = v[heap[2 * p]];
    }
    if (2 * p + 1 <= nre && v[heap[p]] > v[heap[2 * p + 1]] && v[heap[2 * p + 1]] < mini)
        dir = 2 * p + 1;
    if (dir != -1) {
        swap(poz[heap[p]], poz[heap[dir]]);
        swap(heap[p], heap[dir]);
        actualizare_jos(dir);
    }
}

int main() {
    f >> nrop;
    int op, x;
    for (int i = 1; i <= nrop; ++i) {
        f >> op;
        if (op == 1) {
            f >> x;
            v[++n] = x;
            heap[++nre] = n;
            poz[n] = nre;
            actualizare_sus(nre);
        } else if (op == 2) {
            f >> x;
            heap[poz[x]] = heap[nre];
            poz[heap[nre]] = poz[x];
            nre--;
            actualizare_jos(poz[x]);
        } else
            g << v[heap[1]] << '\n';
    }
    return 0;
}