Cod sursa(job #1637666)

Utilizator TopiAlexTopala Alexandru TopiAlex Data 7 martie 2016 18:38:48
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#include <algorithm>
#define N_MAX 200005

int cmd;
int A[N_MAX], n;
int h[N_MAX], l;
int pos[N_MAX];

void adauga(int);
void sterge(int);
int up(int);
int down(int);

int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    scanf("%d", &cmd);

    int com, e;

    for (int i = 1; i <= cmd; ++i){
        scanf("%d", &com);

        switch (com){
        case 1 :
            scanf("%d", &e);
            adauga(e);
            break;
        case 2 :
            scanf("%d", &e);
            sterge(e);
            break;
        case 3 :
            printf("%d\n", A[h[1]]);
            break;
        }
    }

    return 0;
}

int up(int x){
    int p = x;

    while (p/2 && A[h[p]] < A[h[p/2]]){
        std::swap(h[p], h[p/2]);
        pos[h[p]] = p;
        pos[h[p/2]] = p/2;
        p /= 2;
    }
    return p;
}

int down(int x){
    int p = 0;

    while (p != x){
        p = x;
        if (x*2 <= l && A[h[x]] > A[h[x*2]]) x = p * 2;
        if (x + 1 <= l && A[h[x]] > A[h[x+1]]) x = p * 2 + 1;

        std::swap(h[p], h[x]);
        pos[h[x]] = x;
        pos[h[p]] = p;
    }
    return x;
}

void adauga(int elem){
    A[++n] = elem;
    h[++l] = n;
    pos[h[l]] = l;
    up(l);
}

void sterge(int x){
    int p = pos[x];
    A[x] = -1;
    up(p);
    pos[h[1]] = 0;
    h[1] = h[l--];
    pos[h[1]] = 1;
    if (l > 1) down(1);

}