Cod sursa(job #2741693)

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

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

int Ordine[200000], Heap[200000], hp_ultim = -1;

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

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

void stergere(int ord)
{
    int poz = 0;
    while(Heap[poz] != Ordine[ord])
        ++poz;

    Heap[poz] = Heap[hp_ultim--];
    int fiu_stanga = 2 * poz + 1;
    while(fiu_stanga <= hp_ultim)
    {
        int schimbat = poz;
        if(Heap[fiu_stanga] < Heap[schimbat])
            schimbat = fiu_stanga;
        if(fiu_stanga + 1 <= hp_ultim && Heap[fiu_stanga + 1] < Heap[schimbat])
            ++schimbat;
        if(schimbat != poz)
            std::swap(Heap[poz], 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;
            Ordine[++Ordine[0]] = x;
            inserare(x);
        }
        else if(Op == 2)
        {
            f >> x;
            stergere(x);
        }
        else
            g << Heap[0] << '\n';
    }
    return 0;
}