Cod sursa(job #936443)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 7 aprilie 2013 10:42:12
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>
#include <algorithm>
#include <cassert>
using namespace std;

const int DMAX = 200005;
int H[DMAX], l, X, CR[DMAX], IN[DMAX];

void heap_insert () {

    int cnod = H[l], i = l;
    while (H[i / 2] > cnod && i != 1)
        H[i] = H[i / 2], swap (CR[IN[i]], CR[IN[i / 2]]), swap (IN[i], IN[i / 2]), i /= 2;
    H[i] = cnod;

}

void heap_eject (int nod) {

    int i = nod, cnod = H[nod]; bool k;
    while (H[i / 2] > cnod && i != 1)
        H[i] = H[i / 2], swap (CR[IN[i]], CR[IN[i / 2]]), swap (IN[i], IN[i / 2]), i /= 2;
    while (k = (H[i * 2] < H[i]) || H[i * 2 + 1] < H[i])
        if(k)
            H[i] = H[i * 2], swap (CR[IN[i]], CR[IN[i * 2]]), swap (IN[i], IN[i * 2]), i *= 2;
        else
            H[i] = H[i * 2 + 1], swap (CR[IN[i]], CR[IN[i * 2 + 1]]), swap (IN[i], IN[i * 2 + 1]), i = i * 2 + 1;
    H[i] = cnod;

}

int main() {

    freopen ("heapuri.in", "r", stdin); freopen ("heapuri.out", "w", stdout);
    int N, C = 0, i = 0, j;
    scanf ("%d", &N);
    while (N--) {
        scanf("%d", &C);
        switch (C) {
        case 1:
            scanf ("%d", &X); H[++l] = X; CR[++i] = l; IN[l] = i; heap_insert(); break;
        case 2:
            scanf ("%d", &X); H[CR[X]] = H[l--]; heap_eject (CR[X]); break;
        default:
            printf ("%d\n", H[1]);
        }
    }

}