Cod sursa(job #1864869)

Utilizator margikiMargeloiu Andrei margiki Data 1 februarie 2017 02:50:58
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
# include <bits/stdc++.h>
# define NR 200005
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int i,j,n,m,x,op,elem,nrIntroduse;
int HEAP[NR], positionOfIndex[NR], indexOnPosition[NR];

void SWAP(int k1, int k2) {


    int index1 = indexOnPosition[k1];
    int index2 = indexOnPosition[k2];
    positionOfIndex[index1] = k2;
    positionOfIndex[index2] = k1;

    swap(indexOnPosition[k1], indexOnPosition[k2]);
}

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 <= elem) {
            son = 2*K;
            if (2*K+1 <= elem && HEAP[2*K+1] < HEAP[2*K]) {
                son = 2*K+1;
            }
        }
        // swap
        if (son && HEAP[son] < HEAP[K]) {
            SWAP(K, son);
            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) { // insereaza
            f>>x;
            HEAP[++elem] = x;

            ++nrIntroduse;

            positionOfIndex[++nrIntroduse] = elem;
            indexOnPosition[elem] = ++nrIntroduse;

            moveUp(elem);
        } else if (op == 2) { // sterge
            f>>x;
            // we delete the element on position positionOfIndex[x];
            int poz = positionOfIndex[x];

            SWAP(elem, poz);
            swap(HEAP[elem], HEAP[poz]);
            --elem;

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

    return 0;
}