Cod sursa(job #2925365)

Utilizator gabriel.9619Gabriel Stefan Tita gabriel.9619 Data 15 octombrie 2022 00:10:01
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int v[200001], h[200001], nr;

int father(int nod)
{
    return nod/2;
}

int left_son(int nod)
{
    return nod*2;
}

int right_son(int nod)
{
    return nod*2+1;
}

void sift(int h[], int nr, int k)
{
    int son, pson;
    do
    {
        son=0;
        if(left_son(k)<=nr)
        {
            son=left_son(k);
            if(right_son(k)<=nr&&h[right_son(k)]<h[left_son(k)])
            {
                son=right_son(k);
            }
            if(h[son]>=h[k])
            {
                son=0;
            }
        }
        if(son)
        {
            swap(v[k], v[son]);
            swap(h[k], h[son]);
            k=son;
        }
    }while(son);
}

void percolate(int h[], int nr, int k)
{
    int crt=h[k];
    while(k>1&&crt<h[father(k)])
    {
        h[k]=h[father(k)];
        swap(v[k], v[father(k)]);
        k=father(k);
    }
    h[k]=crt;
    swap(v[k], v[nr]);
}

void cut(int h[], int &nr, int k)
{
    h[k]=h[nr];
    swap(v[k], v[nr]);
    nr--;
    if((k>1)&&(h[k]<h[father(k)]))
    {
        percolate(h, nr, k);
    }
    else
    {
        sift(h, nr, k);
    }
}

int main()
{
    int i=0, n, c, x;
    fin>>n;
    for(int j=1;j<=n;j++)
    {
        fin>>c;
        if(c==1)
        {
            fin>>x;
            i++;
            v[i]=i;
            nr++;
            h[nr]=x;
            percolate(h, nr, nr);
        }
        else
        if(c==2)
        {
            fin>>x;
            cut(h, nr, v[x]);
        }
        else
        {
            fout<<h[1]<<"\n";
        }
        /**for(int z=1;z<=nr;z++)
        {
            fout<<h[z]<<" ";
        }
        fout<<"\n";
        for(int z=1;z<=nr;z++)
        {
            fout<<v[z]<<" ";
        }
        fout<<"\n";
        fout<<"\n";**/
    }
}