Cod sursa(job #2768685)

Utilizator RTG123Razvan Diaconescu RTG123 Data 11 august 2021 19:49:35
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n,q,a,v[200001],nr,afis[200001];
void downs (int poz)
{
    if (poz*2<=nr)
    {
    int swapp,inloc;
    if (v[poz]>v[poz*2] || v[poz]>v[poz*2+1])
    {

        if (v[poz*2]>v[poz*2+1])
        {

            swapp=poz*2+1;

        }
        else swapp=poz*2;
        inloc=v[swapp];
        v[swapp]=v[poz];
            v[poz]=inloc;
            if (swapp<nr)
            downs(swapp);
    }
    }

}
void ups (int poz)
{
    if (v[poz]<v[poz/2])
    {
        int inloc;
        inloc=v[poz];
        afis[v[poz]]=poz/2;
        afis[v[poz/2]]=poz;
        v[poz]=v[poz/2];
        v[poz/2]=inloc;
        if (poz/2>0)
        ups(poz/2);
    }
}
void elim (int poz,int &nr)
{
    int ok=0,save;
    for (int i=1; i<nr && ok==0; i++)
    {
        if (v[i]==poz)
        {
            ok=1;
            v[i]=v[nr];
            save=i;
        }
    }

    if (v[nr]==poz && ok==0)
    {
        v[nr]=0;
    }
    //v[poz]=v[nr];
    nr--;
    if (save>1 && (v[save]>v[save/2]))
    {
        ups(save);
    }
    else
    {
        downs(save);
    }
}
int main()
{
    f>>n;
    for (int i=1; i<=n; i++)
    {
        f>>q;
        if (q==1)
        {
            f>>a;
            nr++;
            v[nr]=a;
            afis[nr]=a;
            ups(nr);
        }
        else if (q==2)
        {
            f>>a;
            elim(afis[a],nr);
        }
        else
        {
            g<<v[1]<<'\n';
        }

    }
    /*cout<<'\n';
    for (int i=1; i<=nr; i++)
        cout<<v[i]<<' ';*/
    return 0;
}