Cod sursa(job #1385089)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 11 martie 2015 18:02:07
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

#define inFile "heapuri.in"
#define outFile "heapuri.out"
#define MAX_N 200001

int v[MAX_N];
int p[MAX_N];

class heap {
public:
    int h[MAX_N];
    int n;
    heap();
    int top();
    void up(int node);
    void down(int node);
    void ins(int val);
    void del(int pos);
};

heap :: heap() {
    memset(h, 0, sizeof(h));
    n = 0;
}

int heap :: top() {
    return v[h[1]];
}

void heap :: up(int node) {
    int init = h[node];
    while(node > 1 && v[init] < v[h[node/2]]) {
        p[h[node/2]] = node;
        h[node] = h[node/2];
        node = node/2;
    }
    p[init] = node;
    h[node] = init;
}

void heap :: down(int node) {
    int son;
    do {
        son = 0;
        if(2*node <= n)
            son = 2*node;
        if(2*node + 1 <= n) 
            if(v[h[2*node + 1]] < v[h[son]])
                son = 2*node+1;
        if(v[h[son]] > v[h[node]]) son = 0;
        if(son) {
            p[h[son]] = node;
            p[h[node]] = son;
            swap(h[node], h[son]);
            node = son;
        }
    } while(son);
}

void heap :: ins(int val) {
    ++n;
    h[n] = val;
    p[val] = n;
    up(n);
}

void heap :: del(int pos) {
    p[h[n]] = pos;
    h[pos] = h[n];
    n--;
    if(pos > 1 && v[h[pos]] < v[h[pos/2]]) 
        up(pos);
    else
        down(pos);
}

int main() {
    freopen(inFile, "r", stdin);
    freopen(outFile, "w", stdout);
    
    int q, code, val, i, nr_el = 0;
    heap H;
    
    scanf("%d", &q);
    for(i = 1; i <= q; i++) {
        scanf("%d", &code);
        if(code == 3)
            printf("%d\n", H.top());
        else {
            scanf("%d", &val);
            if(code == 1) {
                v[++nr_el] = val;
                H.ins(nr_el);
            }
            else if(code == 2) 
                H.del(p[val]);
        }
    }
    
    return 0;
}