Cod sursa(job #235795)

Utilizator Mishu91Andrei Misarca Mishu91 Data 25 decembrie 2008 21:22:01
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cstdio>

#define MAX_N 2005

int A[MAX_N], Pos[MAX_N], H[MAX_N];
int N, T, Nh;

void swap(int &x, int &y)
{
    int aux = x;
    x = y;
    y = aux;
}

void insert(int k)
{
    int i = N;
    while(i/2 && H[i/2] > H[i])
    {
        swap(H[i], H[i/2]);
        swap(A[i], A[i/2]);
        Pos[A[i]] = i;
        Pos[A[i/2]] = i/2;
        i /= 2;
    }

}

void erase(int i)
{
    swap(H[i], H[N]);
    swap(A[i], A[N]);
    Pos[A[i]] = i;
    Pos[A[N]] = N;
    N--;

    while(1)
    {
        int j = 2*i;
        if(j > N) break;
        if(H[j+1] < H[j] && (j+1) <= N) ++j;
        if(H[j] > H[i]) break;

        swap(H[j], H[i]);
        swap(A[j], A[i]);

        Pos[A[i]] = i;
        Pos[A[j]] = j;
        i = j;
    }
}

int main()
{
    freopen("heapuri.in","rt",stdin);
    freopen("heapuri.out","wt",stdout);

    scanf("%d",&T);

    while(T--)
    {
        int tip, x;
        scanf("%d ",&tip);
        if(tip == 1)
        {
            scanf("%d",&x);
            A[++N] = ++Nh;
            Pos[Nh] = Nh;
            H[N] = x;
            insert(x);
        }
        if(tip == 2)
        {
            scanf("%d",&x);
            erase(Pos[x]);
        }
        if(tip == 3)
            printf("%d\n", H[1]);
    }
}