Cod sursa(job #357532)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 19 octombrie 2009 18:57:36
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>

#define FIN "heapuri.in"
#define FOUT "heapuri.out"

#define N 200001

int h[N], m, v[N], a[N];

void swap(int a, int b, int V[])
{
    int aux;

    aux = V[a];

    V[a] = V[b];

    V[b] = aux;
}

void down_heap(int i, int n)
{
	int j = i;

	if (2 * i <= n && h[j] > h[2 * i])
		j = 2 * i;

    if (2 * i + 1 <= n && h[j] > h[2 * i + 1])
		j = 2 * i + 1;

	if (i != j)
	{
		v[a[i]] = j;
		v[a[j]] = i;

        swap(i, j, a);
		swap(i, j, h);

		down_heap(j, n);
	}
}

void up_heap(int i, int n)
{
    if (i > 1 && h[i] < h[i / 2])
    {
        v[a[i]] = i / 2;
        v[a[i / 2]] = i;

        swap(i, i / 2, a);
        swap(i, i / 2, h);

        up_heap(i / 2, n);
    }
}

void insert(int x, int p)
{
    h[++ m] = x;

    v[p] = m;
    a[m] = p;

    up_heap(m, m);
}

void del(int p)
{
    //int x = a[m];

    swap(v[p], m, h);

    v[a[m]] = v[p];
    a[v[p]] = a[m];

    -- m;

    down_heap(v[p], m);
    up_heap(v[p], m);
}

int main()
{
    int i, x, y, n, k = 0;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d", &n);

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

        if (x == 1)
        {
            ++ k;

            scanf("%d", &y);

            insert(y, k);
        }

        if (x == 2)
        {
            scanf("%d", &y);

            del(y);
        }

        if (x == 3)
            printf("%d\n", h[1]);
    }
}