Cod sursa(job #1888884)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 22 februarie 2017 13:23:31
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>

using namespace std;

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

int a[200005],n,l,v,i,t,x,m;
int hp[200010], poz[200010];

void Raise(int x) {
    while (x/2 >= 1 && a[hp[x]] < a[hp[x/2]]) {
        swap(hp[x],hp[x/2]);
        poz[hp[x]] = x;
        poz[hp[x/2]] = x/2;
        x /= 2;
    }
}

void Lower(int x) {
    int y = 0;
    while (x !=y) {
        y = x;
        if (2*y <= l && a[hp[2*y]]<a[hp[x]])
            x = 2*y;
        if (2*y+1 <= l && a[hp[2*y+1]]<a[hp[x]])
            x = 2*y+1;
        poz[hp[y]] = x;
        poz[hp[x]] = y;
        swap(hp[x],hp[y]);
    }
}

void add(int x) {
    n++;
    a[n] = x; l++;
    hp[l] = n;
    poz[n] = l;
    Raise(l);
}

void rem(int x) {
    if (poz[x]) {
        a[x] = -1;
        Raise(poz[x]);
    }
    else return;
    poz[x] = 0;
    hp[1] = hp[l];
    poz[hp[l]] = 1;
    hp[l] = 0;
    l--;
    Lower(1);
}

int main() {
    f >> m;
    while (m--) {
        f >> t;
        if (t == 3) {
            g << a[hp[1]] << '\n';
        }
        else {
            f >> x;
            if (t==1)
                add(x);
            else rem(x);
        }
    }
    return 0;
}