Cod sursa(job #1539637)

Utilizator MarghescuGabriel Marghescu Marghescu Data 1 decembrie 2015 09:30:05
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int H[200010],elem[200010],n;
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 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)
        {
            int aux=H[k];
            H[k]=H[son];
            H[son]=aux;
            k=son;
        }
    } while(son);
}
void percolate(int k)
{
    int nod=H[k];
    while((k>1)&&(nod<=H[tata(k)]))
    {
        H[k]=H[tata(k)];
        k=tata(k);
    }
    H[k]=nod;
}
void stergere(int k)
{
    int i;
    for(i=1;i<=n;i++)
    {
        if(H[i]==k)
            break;
    }
    H[i]=H[n];
    --n;
    if((i>1)&&(H[i]<=H[tata(k)]))
        percolate(i);
    else
        sift(i);
}
void inserare(int nod)
{
    H[++n]=nod;
    percolate(n);
}
int main()
{
    int t,nr,x,j=0;
    f>>nr;
    for(int i=1;i<=nr;i++)
    {
        f>>t;
        if(t==1)
        {
            f>>x;
            elem[++j]=x;
            inserare(x);

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