Cod sursa(job #1124137)

Utilizator DeclinGogonea Andrei Declin Data 26 februarie 2014 11:30:38
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
using namespace std;
int k,a[200010],b[200010],c[200010];
void urc(int x)
{
int aux,q=x >> 1;

    while (q!=0 && c[a[x]]<c[a[q]])
    {
        aux = a[x];
        a[x] = a[q];
        a[q] = aux;
        b[a[x]] = x;
        b[a[q]] = q;
        x >>= 1;
        q >>= 1;
    }
}
void cobor(int x)
{
    int aux, y = 0,w;

    while (x != y)
    {
         y = x;
         w = y << 1;
        if (w<=k && c[a[x]]>c[a[w]]) x = w;
        ++w;
        if (w<=k && c[a[x]]>c[a[w]]) x = w;

        aux = a[x];
        a[x] = a[y];
        a[y] = aux;
        b[a[x]] = x;
        b[a[y]] = y;
    }
}
int main()
{
    int j,n,nr=0,w;
    short e;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    for(j=0;j<n;++j)
    {
        scanf("%hd",&e);
        if(e==1)
        {
            ++k;
            scanf("%d",&w);
            ++nr;
            a[k]=nr;
            b[nr]=k;
            c[nr]=w;
            urc(k);
        }
        else if(e==2)
        {
            scanf("%d",&w);
            c[w]=-1;
            urc(b[w]);
            b[a[1]] = 0;
            a[1] = a[k--];
            b[a[1]] = 1;
            if (k>1) cobor(1);

        }
        else
        printf("%d\n",c[a[1]]);
    }
    return 0;
}