Cod sursa(job #1539639)

Utilizator MarghescuGabriel Marghescu Marghescu Data 1 decembrie 2015 10:22:36
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int H[200010],pozitie[200010],elem[200010],n,d;
int tata(int nod)
{
    return nod/2;
}
int fiu_st(int nod)
{
    return nod*2;
}
int fiu_dr(int nod)
{
    return nod*2+1;
}
void swap(int a,int b)
{
    int x=elem[a],y=elem[b],aux;
    aux=H[b];
    H[b]=H[a];
    H[a]=aux;

    elem[b]=x;
    pozitie[x]=b;

    elem[a]=y;
    pozitie[y]=a;
}
void sift(int k)
{
    int son;
    do{
        son=0;
        if(fiu_st(k)<=n)
        {
            son=fiu_st(k);
            if(fiu_dr(k)<=n&&H[fiu_dr(k)]<H[fiu_st(k)])
                son = fiu_dr(k);
            if (H[son]>=H[k])
                son=0;
        }

        if(son)
        {
            swap(k,son);
            k=son;
        }
    } while(son);
}
void percolate(int k)
{
    int nod=H[k];
    while((k>1)&&(nod<=H[tata(k)]))
    {
        swap(k,tata(k));
        k=tata(k);
    }
    H[k]=nod;
}
void stergere(int k)
{
    swap(k,n);
    --n;
    if((k>1)&&(H[k]<H[tata(k)]))
        percolate(k);
    else
        sift(k);
}
void inserare(int nod)
{
    H[++n]=nod;
    pozitie[++d]=n;
    elem[n]=d;
    percolate(n);
}
int main()
{
    int t,nr,x;
    f>>nr;
    for(int i=1;i<=nr;i++)
    {
        f>>t;
        if(t==1)
        {
            f>>x;
            inserare(x);

        }
        if(t==2)
        {
            f>>x;
            stergere(pozitie[x]);
        }
        if(t==3)
        {
            g<<H[1]<<"\n";
        }
    }
    return 0;
}