Cod sursa(job #2766487)

Utilizator georgipGeorgiana Petricele georgip Data 1 august 2021 22:00:43
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>

using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int poz[200002],ind[200002],h[200002],z,n;
int father(int n)
{
    return n/2;
}
int rightson(int n)
{
    return n*2+1;
}
int leftson(int n)
{
    return n*2;
}
void percolate(int k)
{
    int key=h[k],ii=ind[k];
    while(key<h[father(k)]&&k>1)
    {
        h[k]=h[father(k)];
        poz[ind[father(k)]]=k;
        ind[k]=ind[father(k)];
        k=father(k);
    }
    h[k]=key;
    ind[k]=ii;
    poz[ii]=k;
}
void sift(int k)
{
    int son,key=h[k],ii=ind[k];
    do
    {
        son=0;
        if(leftson(k)<=n)
        {
            son=leftson(k);
            if(son+1<=n&&h[son+1]<h[son])
                son+=1;
            /*/if(h[son]>=h[k])
                son=0;/*/
        }
         if(son&&key>h[son])
        {
            poz[ind[son]]=k;
            ind[k]=ind[son];
            h[k]=h[son];
            k=son;
        }
        else
            son=0;
    }while(son);
    h[k]=key;
    poz[ii]=k;
    ind[k]=ii;
}
void sterg(int k)
{
    h[poz[k]]=h[n];
    poz[ind[n]]=poz[k];
    ind[poz[k]]=ind[n];
    n--;
    percolate(poz[k]);
    sift(poz[k]);
}
void inserez(int x)
{
    h[++n]=x;
    ++z;
    ind[n]=z;
    poz[z]=n;
}
void afismin()
{
    fout<<h[1]<<'\n';
}
int main()
{
    int op,nr,x,i;
    fin>>nr;
    for(i=1;i<=nr;i++)
    {
        fin>>op;
        if(op==1)
            {
                fin>>x;
                inserez(x);
                percolate(n);
            }
        else
            if(op==2)
        {
            fin>>x;
            sterg(x);
        }
        else
            afismin();
    }
    return 0;
}