Cod sursa(job #1267061)

Utilizator diana97Diana Ghinea diana97 Data 19 noiembrie 2014 14:44:03
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f ("heapuri.in");
ofstream g ("heapuri.out");

const int NMAX = 200000 + 1;
const int INF = 1 << 30;

int n, inaltime;
int v[NMAX], heap[2 * NMAX], pozitie[NMAX];

inline int parinte(int nod) {
    return nod / 2;
}

inline int fiu_stang(int nod) {
    return 2 * nod;
}

inline int fiu_drept(int nod) {
    return 2 * nod + 1;
}

inline void schimba(int x, int y) {
    pozitie[heap[x]] = y;
    pozitie[heap[y]] = x;
    swap(heap[x], heap[y]);
}

void urca(int poz) {
    while (1 < poz && v[heap[parinte(poz)]] > v[heap[poz]]) {
        schimba(poz, parinte(poz));
        poz = parinte(poz);
    }
}

void coboara(int poz) {
    while(fiu_stang(poz) <= inaltime) {
        if (fiu_drept(poz) >= inaltime || v[heap[fiu_stang(poz)]] < v[heap[fiu_drept(poz)]]) {
            schimba(poz, fiu_stang(poz));
            poz = fiu_stang(poz);
        }
        else {
            schimba(poz, fiu_drept(poz));
            poz = fiu_drept(poz);
        }
    }
}

void sterge(int x) {
    int poz = pozitie[x];
    heap[poz] = heap[inaltime];
    inaltime--;
    if (heap[parinte(poz)] > heap[poz]) urca(poz);
    else coboara(poz);
}

void insereaza() {
        heap[++inaltime] = n;
        pozitie[n] = inaltime;
        urca(pozitie[n]);
}


void rezolva() {
    int t, a, q;
    f >> q;
    while(q--) {
        f >> t;
        if (t == 1) {
            f >> v[++n];
            insereaza();
        }
        else if (t == 2) {
            f >> a;
            sterge(a);
        }
        else g << v[heap[1]] << '\n';
    }

}
int main() {
    rezolva();
    return 0;
}