Cod sursa(job #1865125)

Utilizator margikiMargeloiu Andrei margiki Data 1 februarie 2017 14:00:42
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
// min heap
# include <bits/stdc++.h>
# define NR 200005
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int HEAP[NR], positionInNode[NR], nodeOfPosition[NR];
int nrelem, elemintroduse, n, x, op;

void SWAP(int k1, int k2) {
    int index1 = positionInNode[k1];
    int index2 = positionInNode[k2];

    positionInNode[k1] = index2;
    positionInNode[k2] = index1;

    nodeOfPosition[index1] = k2;
    nodeOfPosition[index2] = k1;
}
void moveUp (int K) {
    while (K>1 && HEAP[K] < HEAP[K/2]) {
        SWAP(K, K/2);
        swap(HEAP[K], HEAP[K/2]);
        K=K/2;
    }
}
void moveDown (int K) {
    int son = 0;
    do {
        son = 0;
        if (2*K <= nrelem) {
            son = 2*K;
        }
        if (2*K+1 <=nrelem && HEAP[2*K+1] < HEAP[2*K]) {
            son = 2*K+1;
        }

        if (son && HEAP[son] < HEAP[K]) {
            SWAP(son, K);
            swap(HEAP[son], HEAP[K]);
            K = son;

            continue;
        } else break;
    } while (true);
}
int main ()
{
    f>>n;
    for (int i=1; i<=n; ++i) {
        f>>op;
        if (op == 1) { // insert
            f>>x;

            HEAP[++nrelem] = x;
            ++elemintroduse;

            positionInNode[nrelem] = elemintroduse;
            nodeOfPosition[elemintroduse] = nrelem;

            moveUp(nrelem);
        } else if (op == 2) { // delete
            f>>x;
            int node = nodeOfPosition[x];

            SWAP(node, nrelem);
            swap(HEAP[node], HEAP[nrelem]);

            --nrelem;

            moveDown(node);
        } else {
            g<<HEAP[1]<<"\n";
        }
    }


    return 0;
}