Cod sursa(job #2198883)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 25 aprilie 2018 18:54:56
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <cstdio>

FILE *fin = fopen("heapuri.in", "r"), *fout = fopen("heapuri.out", "w");

#define MAXN 200000

int n, heap[MAXN + 1], poz[MAXN + 1], d[MAXN + 1];

inline int tata(int p) {
    return p / 2;
}

inline int fiust(int p) {
    return 2 * p;
}

inline int fiudr(int p) {
    return 2 * p + 1;
}

inline void mySwap(int p, int q) {
    int aux = heap[p];
    heap[p] = heap[q];
    heap[q] = aux;
    poz[heap[p]] = p;
    poz[heap[q]] = q;
}

inline void urcare(int p) {
    if (p > heap[0]) return ;
    while (p > 1 && d[heap[p]] < d[heap[tata(p)]]) {
        mySwap(p, tata(p));
        p = tata(p);
    }
}

inline void coborare(int p) {
    bool f = 1;
    int q;
    while (f && (q = fiust(p)) <= heap[0]) {
        if (fiudr(p) <= heap[0] && d[heap[fiudr(p)]] < d[heap[q]])
            q = fiudr(p);
        if (d[heap[q]] < d[heap[p]]) {
            mySwap(p, q);
            p = q;
        } else
            f = 0;
    }
}

inline void adauga(int x) {
    n++;
    heap[0]++;
    heap[heap[0]] = n;
    poz[n] = heap[0];
    d[n] = x;
    urcare(heap[0]);
}

inline void sterge(int x) {
    int r = heap[heap[0]];
    mySwap(poz[x], heap[0]);
    heap[0]--;
    urcare(poz[r]);
    coborare(poz[r]);
}

int main() {
    int q;
    fscanf(fin, "%d", &q);

    for (; q; q--) {
        int t;
        fscanf(fin, "%d", &t);

        if (t == 1) {
            int x;
            fscanf(fin, "%d", &x);

            adauga(x);
        } else if (t == 2) {
            int x;
            fscanf(fin, "%d", &x);

            sterge(x);
        } else
            fprintf(fout, "%d\n", d[heap[1]]);
    }

    fclose(fin);
    fclose(fout);
    return 0;
}