Cod sursa(job #2047832)

Utilizator eusebiu_gageaGagea Eusebiu-Andrei eusebiu_gagea Data 25 octombrie 2017 13:53:56
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");

const int Nmax = 200001;

int n, lg, nr, v[Nmax], poz[Nmax], heap[Nmax];

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

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

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

void add(int Heap[Nmax], int n, int k) {
    while(k > 1 && v[heap[k]] < v[heap[father(k)]]) {
        swap(heap[k], heap[father(k)]);
        poz[heap[k]] = k;
        poz[heap[father(k)]] = father(k);
        k = father(k);
    }
}

void sterge(int Heap[Nmax], int n, int k) {
    if(father(k) > 1 && Heap[k] < Heap[father(k)])
        add(Heap, n, k);
    else {
        int son;
        do {
            son = 0;
            if(left_son(k) <= n) {
                son = left_son(k);
                if(right_son(k) <= n && right_son(k) < son)
                    son = right_son(k);
            }
            if(son) {
                swap(Heap[k], Heap[son]);
                poz[Heap[k]] = k;
                poz[Heap[son]] = son;
                k = son;
            }
        }while(son);
    }
}

int main()
{
    int i, x, val, pozitie;
    f>>n;
    for(i = 1; i <= n; i++) {
        f>>x;
        if(x < 3) f>>val;
        if(x == 1) {
            v[++nr] = val;
            heap[++lg] = nr;
            poz[nr] = lg;
            add(heap, lg, lg);
        } else if(x == 2) {
            pozitie = poz[val];
            heap[pozitie] = heap[lg];
            poz[heap[pozitie]] = pozitie;
            heap[lg--] = 0; v[val] = -1;
            sterge(heap, lg, pozitie);
        } else
            g<<v[heap[1]]<<'\n';
    }
    return 0;
}