Cod sursa(job #979552)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 1 august 2013 22:04:51
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int NMAX = 200003;
int H[NMAX * 2], V[NMAX], P[NMAX], le, s;

int _min (const int &a, const int &b) {

    return V[H[a]] < V[H[b]] ? a : b;

}

void HEAP_sift (int x) {

    int k = x * 2 + 1 <= le ? _min (x * 2, x * 2 + 1) : x * 2;
    while (V[H[k]] < V[H[x]] && k <= le) {
        swap (H[k], H[x]);
        P[H[k]] = k;
        P[H[x]] = x;
        x = k;
        k = k * 2 + 1 <= le ? _min (k * 2, k * 2 + 1) : k * 2;
    }

}

void HEAP_percolate (int x) {

    while (x / 2 && V[H[x]] < V[H[x / 2]]) {
        swap (H[x], H[x / 2]);
        P[H[x]] = x;
        P[H[x / 2]] = x / 2;
        x /= 2;
    }

}

int main () {

    freopen ("heapuri.in", "r", stdin);
    freopen ("heapuri.out", "w", stdout);
    int N, o, x;
    scanf ("%d", &N);
    while (N--) {
        scanf ("%d", &o);
        if (o == 1) {
            scanf ("%d", &x);
            V[++s] = x;
            H[++le] = s;
            P[s] = le;
            HEAP_percolate (le);
            continue;
        }
        if (o == 2) {
            scanf ("%d", &x);
            H[P[x]] = H[le--];
            HEAP_sift (P[x]);
            HEAP_percolate (P[x]);
            continue;
        }
        printf ("%d\n", V[H[1]]);
    }

}