Cod sursa(job #2952949)

Utilizator iProgramInCppiProgramInCpp iProgramInCpp Data 10 decembrie 2022 11:26:12
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 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 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), par = elem, chi = par * 2;

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

        if (get_elem(chi) < x)
        {
            heap[par] = heap[chi];
            position[heap[chi]] = chi;
            par = chi;
            chi = par * 2;
        }
        else
        {
            break;
        }
    }

    heap[par] = elem;
    position[elem] = par;
}

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';
        }
    }

    return 0;
}