Cod sursa(job #2952980)

Utilizator iProgramInCppiProgramInCpp iProgramInCpp Data 10 decembrie 2022 11:51:11
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.27 kb
#include <bits/stdc++.h>
using namespace std;
//MINHEAP
constexpr int NMAX = 1000002;
ifstream fin ("heapuri.in");
ofstream fout("heapuri.out");

int heap[NMAX], position[NMAX], arr[NMAX], n;

int get_elem(int i)
{
    return arr[heap[i]];
}

void insert_element(int elem)
{
    arr[n + 1] = elem;

    int pos = n + 1, tpos = pos / 2;

    while (tpos != 0 && get_elem(tpos) > elem)
    {
        heap[pos] = heap[tpos];
        position[heap[tpos]] = pos;
        pos = tpos;
        tpos = pos / 2;
    }

    heap[pos] = n + 1;
    position[heap[pos]] = pos;
    n++;
}

int get_min()
{
    return get_elem(1);
}

void dump_heap()
{
    cout << "[Heap Dump] ";
    for (int i = 1; i <= n; i++)
        cout << get_elem (i) << "(" << heap[i] << ") ";
    cout << endl;
}

void erase_element(int parm)
{
    int elem = position[parm];
    if (elem < 0) return;

    heap[elem] = heap[n];
    position[heap[elem]] = position[heap[n]];
    n--;

    position[parm] = -1;

    // combine
    int x = get_elem(elem), xs = heap[elem], par = elem, chi = par * 2;

    if (arr[xs] == 414)
    {
        cout << "Arr!\n";
    }

    while (chi <= n)
    {
        if (chi + 1 <= n && get_elem(chi + 1) < get_elem(chi)) chi++;

        if (get_elem(chi) < arr[xs])
        {
            dump_heap();

            heap[par] = heap[chi];
            position[heap[par]] = par;
            par = chi;
            chi = par * 2;

            dump_heap();
        }
        else
        {
            break;
        }
    }

    if (arr[xs] == 414)
    {
        cout << "Arr!\n";
    }

    heap[par] = xs;
    position[xs] = par;

    dump_heap();
}

int main()
{
    int nops;
    fin >> nops;

    while (nops)
    {
        nops--;

        int op, parm;
        fin >> op;
        if (op < 3) fin >> parm;

        if (op == 1)
        {
            insert_element(parm);
        }
        else if (op == 2)
        {
            erase_element(parm);
        }
        else if (op == 3)
        {
            fout << get_min() << '\n';
        }
        else if (op == 4)
        {
            cout << "Break!  ";
            dump_heap();
            return 0;
        }
    }

    return 0;
}