Cod sursa(job #1559763)

Utilizator aetherAlexandra Vanca aether Data 31 decembrie 2015 15:22:59
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
# include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int h[100000], a[100000], poz[100000], lh, nr;
void urca(int nod)
{
    while (nod/2 && a[h[nod]]<a[h[nod/2]])
    {
        int aux=h[nod];
        h[nod]=h[nod/2];
        h[nod/2]=aux;

        poz[h[nod]]=nod;
        poz[h[nod/2]]=nod/2;

        nod=nod/2;
    }
}
void coboara(int nod)
{
    int son;
    do
    {
        son=0;
        if (nod*2<=lh && a[h[2*nod]]<a[h[nod]])
        {
            son=2*nod;
            if (2*nod+1<=lh && a[h[2*nod+1]]<a[h[son]])
                son=2*nod+1;
        }
        if (a[h[son]]>a[h[nod]])
            son=0;
        if (son)
        {
            int aux=h[nod];
            h[nod]=h[son];
            h[son]=aux;

            poz[h[nod]]=nod;
            poz[h[son]]=son;

            son=nod*2;
        }
    }while (son);
}
int main()
{
    int n, cod, x, i;
    f>>n;
    for (i=1; i<=n; i++)
    {
        f>>cod;
        if (cod<3)
        {
            f>>x;
            if (cod==1)
            {
                //adauga x
                a[++nr]=x;
                h[++lh]=nr;
                poz[nr]=lh;

                urca(lh);

            }
            else
                if (cod==2)
            {
                h[poz[x]]=h[lh];
                lh--;
                if (a[h[poz[x]]]<a[h[poz[x]/2]])
                    urca(poz[x]);
                else
                    coboara(poz[x]);


            }
        }
       else
                g<<a[h[1]]<<'\n';
    }
    return 0;
}