Cod sursa(job #1337343)

Utilizator retrogradLucian Bicsi retrograd Data 8 februarie 2015 21:35:17
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<fstream>

using namespace std;

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

typedef int var;
#define MAXN 100001

var HEAP[MAXN], TIME[MAXN], POS[MAXN];
var heapsize;

void swapp(var n1, var n2) {
    swap(HEAP[n1], HEAP[n2]);
    swap(TIME[n1], TIME[n2]);
    swap(POS[TIME[n1]], POS[TIME[n2]]);
}

void heap_up(var node) {
    if(node == 1) return;
    if(HEAP[node] < HEAP[node/2]) {
        swapp(node, node/2);
        node /= 2;
    }
}

void heap_down(var node) {
    var fiu = node * 2;
    if(fiu > heapsize) return;

    if(fiu+1 <= heapsize && HEAP[fiu] > HEAP[fiu+1])
        fiu++;

    if(HEAP[node] > HEAP[fiu]) {
        swapp(node, fiu);
        heap_down(fiu);
    }
}

var mTime;
void insert(var val) {
    heapsize ++;
    HEAP[heapsize] = val;
    POS[++mTime] = heapsize;
    TIME[heapsize] = mTime;

    heap_up(heapsize);
}

void del(var t) {
    var n = POS[t];
    swapp(n, heapsize--);

    heap_up(n);
    heap_down(n);
}

var extr_min() {
    return HEAP[1];
}

int main() {
    var m, type, x;
    fin>>m;
    while(m--) {
        fin>>type;
        if(type == 3) fout<<extr_min()<<'\n';
        else {
            fin>>x;
            if(type == 1) {
                insert(x);
            } else {
                del(x);
            }
        }
    }
}