Cod sursa(job #2742374)

Utilizator XeinIonel-Alexandru Culea Xein Data 20 aprilie 2021 20:37:43
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>

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

int Numar_ins[200005], Heap[200005], Poz_in_Heap[200005], 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 de_schimbat = poz;
    int fiu_stanga = 2 * poz + 1;
    int fiu_dreapta = fiu_stanga + 1;
    while(fiu_stanga <= hp_ultim)
    {
        if(Numar_ins[ Heap[fiu_stanga] ] < Numar_ins[ Heap[de_schimbat] ])
            de_schimbat = fiu_stanga;
        if(fiu_dreapta <= hp_ultim && Numar_ins[ Heap[fiu_dreapta] ] < Numar_ins[ Heap[de_schimbat] ])
            de_schimbat = fiu_dreapta;
        if(de_schimbat != poz)
        {
            std::swap(Heap[poz], Heap[de_schimbat]);
            std::swap(Poz_in_Heap[ Heap[poz] ], Poz_in_Heap[ Heap[de_schimbat] ]);
        }
        else
            break;
        poz = de_schimbat;
        fiu_stanga = 2 * poz + 1;
        fiu_dreapta = fiu_stanga + 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;
}