Cod sursa(job #794680)

Utilizator mihai995mihai995 mihai995 Data 6 octombrie 2012 20:10:34
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>
using namespace std;

const int N = 200005;

struct Nod{
    int val, key;

    Nod(){
        val = key = 0;
    }

    Nod(int _val, int _key){
        val = _val;
        key = _key;
    }

    inline bool operator< (Nod X){
        return key < X.key;
    }
};

struct Heap{
    Nod H[N];
    int index[N], n;

    Heap(){
        n = 0;
    }

    void swap(int& a, int& b){
        int c = a;
        a = b;
        b = c;
    }

    void swap(Nod& a, Nod& b){
        Nod c = a;
        a = b;
        b = c;
    }

    void sch(int a, int b){
        swap(H[a], H[b]);
        swap(index[ H[a].val ], index[ H[b].val ]);
    }

    void up(int poz){
        while (poz > 1 && H[poz] < H[poz >> 1]){
            sch(poz, poz >> 1);
            poz >>= 1;
        }
    }

    void down(int poz){
        int m = poz; poz = -1;

        while (poz != m){
            poz = m;

            for (int x = poz << 1 ; x <= (poz << 1) + 1 ; x++)
                if (x <= n && H[x] < H[m])
                    m = x;

            if (m != poz)
                sch(m, poz);
        }
    }

    void push(Nod x){
        H[++n] = x;
        index[x.val] = n;

        up(n);
    }

    void pop(int key){
        int P = index[key];

        if (!P)
            return;

        sch(P, n--);

        up(P);
        down(P);

        index[key] = 0;
    }

    inline int top(){
        return H[1].key;
    }
} H;

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

int main(){
    int t, x, ins = 0;

    in >> t;

    while (t--){
        in >> x;

        if (x == 1){
            in >> x;

            H.push(Nod(++ins, x));
            continue;
        }

        if (x == 2){
            in >> x;

            H.pop(x);
            continue;
        }

        out << H.top() << "\n";
    }

    return 0;
}