Cod sursa(job #898156)

Utilizator bulbulicaAlexandrescu Cristian bulbulica Data 28 februarie 2013 07:58:38
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <cstdio>
using namespace std;

int A[200005], Heap[200005], Pos[200005], t, n;

template <class T> void swap ( T& a, T& b )
{
    T c(a);
    a=b;
    b=c;
}
void up(int p)
{
    while(p > 0 && A[Heap[p]] < A[Heap[(p-1)/2]]){
        swap(Heap[p], Heap[(p-1)/2]);
        Pos[Heap[p]] = p;
        Pos[Heap[(p-1)/2]] = (p-1)/2;
        p=(p-1)/2;
    }
}

void down(int p)
{
    int son;
    while(son!=-1)
    {
        son = -1;
        if((2*p+1) < n)
        {
            son=2*p+1;
            if((2*p+2) < n && A[Heap[son]] > A[Heap[2*p+2]])
                son = 2*p+2;
        }

        if(son != -1)
        {
            if(A[Heap[son]] < A[Heap[p]])
            {
                swap(Heap[son], Heap[p]);
                Pos[Heap[son]] = son;
                Pos[Heap[p]] = p;
                p = son;
            }
            else
            {
                son = -1;
            }
        }

    }
}
void insert(int x)
{
    A[t] = x, Pos[t] = n, Heap[n] = t;
    ++t, ++n;
    up(n-1);
}

void del(int x)
{
    int pos = Pos[x];
    A[x] = -1;

    up(pos);

    Heap[0] = Heap[n-1];
    Pos[Heap[0]] = 0;

    n--;

    down(0);
}

int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);

    int i, x, cod, N;

    scanf("%d ", &N);

    for (i=1; i<=N; i++)
    {
        scanf("%d ", &cod);

        if (cod == 1)
        {
            scanf("%d", &x);
            insert(x);
        }

        if (cod == 2)
        {
            scanf("%d", &x);
            del(x-1);
        }

        if (cod == 3){
            printf("%d\n", A[Heap[0]]);
        }
    }

    return 0;
}