Cod sursa(job #1853607)

Utilizator horiacoolNedelcu Horia Alexandru horiacool Data 21 ianuarie 2017 21:33:45
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.96 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");

int N,h,k,heap[200001],val[200001],poz[200001];

inline int father(int nod)
{
    return heap[ poz[nod]/2 ];
}
inline int left_son(int nod)
{
    return heap[ poz[nod]*2 ];
}
inline int right_son(int nod)
{
    return heap[ poz[nod]*2 + 1 ];
}

void up(int nod)
{
    int aux;
    while( val[ nod ] < val[ father(nod) ] && father(nod) != 0 )
    {
        aux = father(nod);

        heap[ poz[ nod ] ] = aux;
        heap[ poz[ aux ] ] = nod;

        poz[ aux ] = poz[ nod ];
        poz[ nod ] = poz[ nod ] / 2;
    }
}

void down(int nod)
{
    int aux,ok=1;

    while( ok == 1 )
    {
        if( left_son(nod) == 0 || right_son(nod) == 0 )
            ok = 3;
        else
        if( val[ left_son(nod) ] >= val[ nod ] && val[ right_son(nod) ] >= val[ nod ] )
            ok = 2;
        else
        {
             if( val[ left_son(nod) ] < val[ right_son(nod) ] && val[ left_son(nod) ] < val[ nod ] )
             {
                aux = left_son(nod);

                heap[ poz[ nod ] ] = aux;
                heap[ poz[ aux ] ] = nod;

                poz[ aux ] = poz[ nod ];
                poz[ nod ] = poz[ nod ] * 2;
             }
             else
            if( val[ right_son(nod) ] <= val[ left_son(nod) ] && val[ right_son(nod) ] < val[ nod ] )
            {
                aux = right_son(nod);

                heap[ poz[ nod ] ] = aux;
                heap[ poz[ aux ] ] = nod;

                poz[ aux ] = poz[ nod ];
                poz[ nod ] = poz[ nod ] * 2 + 1;
            }
        }
    }

    if( ok == 2 )
       return;

    if( val[ left_son(nod) ] < val[ nod ] && left_son(nod) != 0 && right_son(nod) == 0 )
    {
        aux = left_son(nod);

        heap[ poz[ nod ] ] = aux;
        heap[ poz[ aux ] ] = nod;

        poz[ aux ] = poz[ nod ];
        poz[ nod ] = poz[ nod ] * 2;
    }
    else
    if( val[ right_son(nod) ] < val[ nod ] && right_son(nod) != 0 && left_son(nod) == 0 )
    {
        aux = right_son(nod);

        heap[ poz[ nod ] ] = aux;
        heap[ poz[ nod ]*2 ] = nod;

        poz[ aux ] = poz[ nod ];
        poz[ nod ] = poz[ nod ] * 2;
    }
}

void Eliminare(int nod)
{
    int aux = heap[h];
    poz[ aux ] = poz[ nod ];
    heap[ poz[ nod ] ] = aux;
    poz[ nod ] = 0;
    heap[h] = 0;
    h--;

    up(aux);
    down(aux);
}

int main()
{
    f>>N;

    int a,b;

    for(int i = 1 ; i <=N ; i++)
    {
        f>>a;

        if( a == 3 )
           g<<val[ heap[1] ]<<'\n';
        else
        if( a == 2 )
        {
            f>>b;
            Eliminare(b);
        }
        else
        if( a == 1 )
        {
            f>>b;
            k++;
            h++;
            poz[k] = h;
            val[k] = b;
            heap[h] = k;
            up(k);
        }

    }

    return 0;
}