Cod sursa(job #2354206)

Utilizator fremenFremen fremen Data 25 februarie 2019 00:29:27
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

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

const int MAXN = 200005;
int n, m;
int h[MAXN];
int nr;
int ord[MAXN], poz[MAXN];

int parent(int k) {
    return k / 2;
}

int left(int k) {
    return k * 2;
}

int right(int k) {
    return k * 2 + 1;
}

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

void up(int k) {
    while (parent(k) >= 1 && h[k] < h[parent(k)]) {
        swapNode(k, parent(k));
        k = parent(k);
    }
}

void down(int k) {
    int ok = 1;
    while (ok > 0) {
        int l = left(k);
        int r = right(k);
        ok = 0;
        if (l <= n && h[l] < h[k]) {
            ok = l;
        }
        if (r <= n) {
            if (h[r] < h[k]) {
                if (ok == 0 || h[r] < h[l]) {
                    ok = r;
                }
            }
        }
        if (ok > 0) {
            swapNode(ok, k);
            k = ok;
        }
    }
}

void add(int k) {
    n++;
    h[n] = k;
    poz[n] = ++nr;
    ord[nr] = n;
    up(n);
}

void del(int k) {
    swapNode(k, n);
    n--;
    if (k > 1 && h[k] < h[parent(k)]) {
        up(k);
    }
    else {
        down(k);
    }
}

int main() {

    fin >> m;

    for (int i = 1; i <= m; ++i) {
        int cer;
        fin >> cer;
        if (cer == 3) {
            fout << h[1] << '\n';
        }
        else {
            int k;
            fin >> k;
            if (cer == 1) {
                add(k);
            }
            else {
                del(ord[k]);
            }
        }
    }

    fout.close();
    return 0;
}