Cod sursa(job #2325847)

Utilizator andra_moldovanAndra Moldovan andra_moldovan Data 22 ianuarie 2019 23:06:40
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>

#define MAXN 200005

using namespace std;

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

struct two{
    int val, poz;
};

two heap[MAXN  * 2];
int fr[MAXN], N, NN;

inline void Add(int neww) {
    int dad, son; NN++;
    heap[NN] = {neww, NN}; fr[heap[NN].poz] = NN;

    dad = NN / 2; son = NN;

    while (dad > 0 && heap[son].val < heap[dad].val) {
        swap(heap[son], heap[dad]);
        fr[heap[son].poz] = son; fr[heap[dad].poz] = dad;
        son = dad; dad /= 2;
    }
}

inline int Det_min(int left_son, int right_son) {
    if (heap[left_son].val < heap[right_son].val)
        return left_son;
    return right_son;
}

inline void Delete(int poz) {
    int dad, left_son, right_son, auxi, son;
    heap[poz] = heap[NN--];
    fr[heap[poz].poz] = poz;
    dad = poz;
    left_son = dad * 2; right_son = dad * 2 + 1;

    while (left_son <= NN) {
        auxi = 0;
        if (right_son <= NN) {
            auxi = Det_min(left_son, right_son);
        }
        else
            auxi = left_son;

        if (heap[dad].val > heap[auxi].val) {
            fr[heap[dad].poz] = auxi;
            fr[heap[auxi].poz] = dad;
            swap(heap[dad], heap[auxi]);
            dad = auxi; left_son = dad * 2; right_son = left_son + 1;
        }
        else
            break;
    }
    dad = poz / 2; son = poz;

    while (dad > 0 && heap[son].val < heap[dad].val) {
        swap(heap[son], heap[dad]);
        fr[heap[son].poz] = son; fr[heap[dad].poz] = dad;
        son = dad; dad /= 2;
    }
}

inline void Read() {
    int tip, x;

    fin >> N;

    for (int i = 1; i <= N; i++) {
        fin >> tip;

        if (tip == 1) {
            fin >> x;

            Add(x);
        }
        else if (tip == 2) {
            fin >> x;
            Delete(fr[x]);
        }
        else
            fout << heap[1].val << "\n";
    }
}

int main () {
    Read();

    fin.close(); fout.close(); return 0;
}