Cod sursa(job #1625531)

Utilizator Harsan_SabinHarsan Sabin Harsan_Sabin Data 2 martie 2016 19:33:25
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <fstream>
#define lg H[0]
#define k Poz[0].poz

using namespace std;

ifstream cin("heapuri.in");
ofstream cout("heapuri.out");

struct Ix{ int poz,val; };

Ix Poz[200003];

int n,i,j;

int H[200003];

int TA(int x){return x/2;}
int FS(int x){return x*2;}
int FD(int x){return x*2+1;}

void Promovare(int nod)
{
    while(TA(nod)>=1 && Poz[H[TA(nod)]].val > Poz[H[nod]].val)
    {
        int aux1=TA(nod),aux2=nod;

        swap(Poz[H[TA(nod)]].poz , Poz[H[nod]].poz);
        swap(H[TA(nod)],H[nod]);

        nod=TA(nod);
    }
}

void Retrogradare(int nod)
{
    int fi=0;

    if(FS(nod) > lg)
        return;

    if(FD(nod) <= lg)
    {
        if(Poz[H[FS(nod)]].val < Poz[H[FD(nod)]].val)
            fi=FS(nod);
        else
            fi=FD(nod);
    }
    else
        fi=FS(nod);

    if(Poz[H[nod]].val > Poz[H[fi]].val)
    {
        swap(Poz[H[nod]].poz , Poz[H[fi]].poz);
        swap(H[nod] , H[fi]);

        Retrogradare(fi);
    }
}

void Erase_H(int nod)
{
    H[Poz[nod].poz]=H[lg];

    Poz[H[lg]].poz=Poz[nod].poz;
    Poz[nod].val=0;

    H[lg]=0;
    --lg;

    if(H[Poz[nod].poz]!=0)
    {
        if(Poz[nod].poz==1)
        {
            Retrogradare(Poz[nod].poz);
            return;
        }

        if(Poz[H[TA(Poz[nod].poz)]].val > Poz[H[Poz[nod].poz]].val)
            Promovare(Poz[nod].poz);
        else
            Retrogradare(Poz[nod].poz);

        Poz[nod].poz=0;
    }
}

void Afis()
{
    for(int z=1;z<=lg;++z)
        cout<<Poz[H[z]].val<<' ';
    cout<<'\n';
}

int main()
{
    cin>>n;
    for(int z=1;z<=n;++z)
    {
        cin>>i;
        if(i==1)
        {
            cin>>j;

            Poz[++k].poz=++lg;
            Poz[k].val=j;
            H[lg]=k;

            Promovare(lg);
            //Afis();
        }
        if(i==2)
        {
            cin>>j;
            if(Poz[j].val==328)
                Poz[j].val=328;
            Erase_H(j);

            /*cout<<"\n *********** ";
            Afis();
            cout<<'\n';*/
        }
        if(i==3)
            cout<<Poz[H[1]].val<<'\n';
    }

    return 0;
}