Cod sursa(job #3141762)

Utilizator ggaaggaabbiigoteciuc gabriel ggaaggaabbii Data 16 iulie 2023 13:34:57
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>

using namespace std;

#define MAXN 200010
ifstream f("heapuri.in");
ofstream g("heapuri.out");

int h[MAXN], poz[MAXN], v[MAXN], n, op, N, x, k;

void schimba(int x, int y) {
    swap(h[x], h[y]);
    poz[h[x]] = x;
    poz[h[y]] = y;
}

void sift(int poz) {
    int nod = poz;
    if (2 * poz <= N && v[h[2 * poz]] < v[h[nod]]) {
        nod = 2 * poz;
    }
    if (2 * poz + 1 <= N && v[h[2 * poz + 1]] < v[h[nod]]) {
        nod = 2 * poz + 1;
    }
    if (nod != poz) {
        schimba(nod, poz);
        sift(nod);
    }
}

void perlocate(int poz) {
    while (poz > 1 && v[h[poz]] < v[h[poz / 2]]) {
        schimba(poz, poz / 2);
        poz /= 2;
    }
}

void del(int poz) {
    schimba(poz, N--);
    perlocate(poz);
    sift(poz);
}

int main()
{
    f >> n;
    for (int i = 0; i < n; ++i) {
        f >> op;
        if (op == 3) {
            g << v[h[1]] << '\n';
        } else if (op == 2) {
            f >> x;
            del(poz[x]);
        } else {
            f >> v[++k];
            h[++N] = k;
            poz[k] = N;
            perlocate(N);
        }
    }
    return 0;
}