Cod sursa(job #235834)

Utilizator Mishu91Andrei Misarca Mishu91 Data 25 decembrie 2008 23:30:39
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>

#define MAX_N 200005
#define DIM 8192

int A[MAX_N], Pos[MAX_N], H[MAX_N];
int N, T, Nh, ind;
char buf[DIM];

void read(int &x)
{
    x = 0;
    while(buf[ind] > '9' || buf[ind] < '0')
        if(++ind == DIM)
            fread(buf, DIM, sizeof buf, stdin), ind = 0;
    while(buf[ind] <= '9' && buf[ind] >= '0')
    {
        x = x*10 + buf[ind] - '0';

        if(++ind == DIM)
            fread(buf, DIM, sizeof buf, stdin), ind = 0;
    }
}

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);

    read(T);

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