Cod sursa(job #2741697)

Utilizator XeinIonel-Alexandru Culea Xein Data 17 aprilie 2021 23:34:40
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>

std::ifstream f("heapuri.in");
std::ofstream g("heapuri.out");

int Numar_ins[200000], Heap[200000], Poz_in_Heap[200000], hp_ultim = -1;

void inserare(int x)
{
    Numar_ins[ ++Numar_ins[0] ] = x;
    Heap[++hp_ultim] = Numar_ins[0];
    Poz_in_Heap[ Numar_ins[0] ] = hp_ultim;

    int pozitie_val = hp_ultim;
    int parinte = (pozitie_val - 1) / 2;
    while(pozitie_val && Numar_ins[ Heap[parinte] ] > Numar_ins[ Heap[pozitie_val] ])
    {
        std::swap(Heap[parinte], Heap[pozitie_val]);
        std::swap(Poz_in_Heap[ Heap[parinte] ], Poz_in_Heap[ Heap[pozitie_val] ]);

        pozitie_val = parinte;
        parinte = (pozitie_val - 1) / 2;
    }
}

void stergere(int ord)
{
    int poz = Poz_in_Heap[ord];

    Heap[poz] = Heap[hp_ultim--];
    Poz_in_Heap[ Heap[poz] ] = poz;

    int fiu_stanga = 2 * poz + 1;
    while(fiu_stanga <= hp_ultim)
    {
        int schimbat = poz;
        if(Numar_ins[ Heap[fiu_stanga] ] < Numar_ins[ Heap[schimbat] ])
            schimbat = fiu_stanga;
        if(fiu_stanga + 1 <= hp_ultim && Numar_ins[ Heap[fiu_stanga + 1] ] < Numar_ins[ Heap[schimbat] ])
            ++schimbat;
        if(schimbat != poz)
        {
            std::swap(Heap[poz], Heap[schimbat]);
            std::swap(Poz_in_Heap[ Heap[poz] ], Poz_in_Heap[ Heap[schimbat] ]);
        }
        else
            break;
        poz = schimbat;
        fiu_stanga = 2 * poz + 1;
    }
}

int main()
{
    int N;
    f >> N;
    for(int Op, x, i = 0; i < N; ++i)
    {
        f >> Op;
        if(Op == 1)
        {
            f >> x;
            inserare(x);
        }
        else if(Op == 2)
        {
            f >> x;
            stergere(x);
        }
        else
            g << Numar_ins[ Heap[0] ] << '\n';
    }
    return 0;
}