Cod sursa(job #2940212)

Utilizator velciu_ilincavelciu ilinca velciu_ilinca Data 15 noiembrie 2022 01:30:47
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.31 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int nod_val[250005];
int nrnod,nrins[250005],cateins;
vector<int>pushagain;
void insertvalue(int val)
{
    nrnod++;
    nod_val[nrnod]=val;//adaug pe ultima poz
    int nodcurent=nrnod;
    while(nodcurent>1 && nod_val[nodcurent/2]>nod_val[nodcurent])//parent>child
    {
        swap(nod_val[nodcurent/2],nod_val[nodcurent]);
        nodcurent=nodcurent/2;
    }

}
void popvalue(int val)
{
    swap(nod_val[1],nod_val[nrnod]);
    nrnod--;
    int nodcurent=1;
    int child1=-1;
    int child2=-1;
    if(nodcurent*2<=nrnod)
        child1=nod_val[nodcurent*2];
    if(nodcurent*2+1<=nrnod)
        child2=nod_val[nodcurent*2+1];
    int cmp=min(child1,child2);
    while(cmp!=-1 && nod_val[nodcurent]>cmp)
    {
        if(child1<child2)
        {
            swap(nod_val[nodcurent],nod_val[nodcurent*2]);
            nodcurent=nodcurent*2;
        }
        else
        {
            swap(nod_val[nodcurent],nod_val[nodcurent*2+1]);
            nodcurent=nodcurent*2+1;
        }
        child1=-1;
        child2=-1;
        if(nodcurent*2<=nrnod)
            child1=nod_val[nodcurent*2];
        if(nodcurent*2+1<=nrnod)
            child2=nod_val[nodcurent*2+1];
        cmp=min(child1,child2);

    }
}
int main()
{
    int n;
    in>>n;
    for(int i=1;i<=n;i++)
    {
        int op;
        in>>op;
        if(op==1)
        {
            int val;
            in>>val;
            insertvalue(val);
            nrins[++cateins]=val;
            /*for(int j=1;j<=nrnod;j++)
                out<<nod_val[j]<<' ';
            out<<'\n';*/

        }
        pushagain.clear();
        if(op==2)
        {
            int nrx;
            in>>nrx;
            int j=1;
            while(j<=nrnod && nod_val[j]!=nrins[nrx])
            {
                pushagain.push_back(nod_val[j]);
                j++;
            }
            for(int k=0;k<pushagain.size();k++)
                popvalue(pushagain[k]);
            popvalue(nrins[nrx]);
            for(int k=0;k<pushagain.size();k++)
                insertvalue(pushagain[k]);
        }
        if(op==3)
        {
            out<<nod_val[1]<<'\n';
        }

    }


    return 0;
}