Cod sursa(job #995132)

Utilizator MihaelaJianuMihaela Jianu MihaelaJianu Data 7 septembrie 2013 17:02:52
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include<cstdio>
#include<algorithm>
using namespace std;

int a[200000],p[200000],q[200000];

void percolate(int n, int k)
{
    int key = a[k];
    while ((k > 1) && (key < a[k/2]))
    {
        a[k] = a[k/2];
        swap(p[q[k]],p[q[k/2]]);
        swap(q[k],q[k/2]);
        k = k/2;
    }
    a[k] = key;
    }

void sift(int n, int k)
{
    int son;
    do {
        son = 0;
        // Alege un fiu mai mare ca tatal.
        if (k*2 <= n) {
            son = k*2;
            if (k*2+1 <= n && a[k*2] > a[k*2+1]) {
                son = k*2+1;
            }
            if (a[son] >= a[k]) {
                son = 0;
            }
        }
        if (son)
        {
            swap(a[k], a[son]);  // Functie STL ce interschimba H[K] cu H[son].
            swap(p[q[k]],p[q[son]]);
            swap(q[k],q[son]);
            k = son;
        }
    } while (son);
}

void sterge(int k, int& n)
{
    a[k]=a[n];
    p[q[n]]=p[q[k]];
    q[k]=q[n];
    --n;
    if ((k > 1) && (a[k] < a[k/2]))
    {
        percolate(n,k);
    }
    else
    {
        sift(n,k);
    }
}

void insereaza(int key, int& n)
{
    a[n] = key;
    percolate(n, n);
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    int t,n=0,k=1,x;
    scanf("%d",&t);
    while(t)
    {
        --t;
        scanf("%d",&x);
        switch(x)
        {
            case 1:
            {
                scanf("%d",&x);
                ++n;
                p[k]=n;
                q[n]=k;
                insereaza(x,n);
                ++k;
                break;
            }
            case 2:
            {
                scanf("%d",&x);
                sterge(p[x],n);
                break;
            }
            default:printf("%d\n",a[1]);break;
        }
    }
    return 0;
}