Cod sursa(job #2805871)

Utilizator namesurname01Name Surname namesurname01 Data 22 noiembrie 2021 02:54:03
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>
#define N 200012

using namespace std;

int heap[N], where[N], intr[N], n, cate;

void sift(int x, int i, int ord)
{
    int son, alc;
    do
    {
        son = 0;
        if (2 * i <= cate)//are fiu stang
        {
            son = 2 * i;
            if (2 * i + 1 <= cate && heap[2 * i + 1] < heap[2 * i])
                son = 2 * i + 1;
        }
        if (son && x > heap[son])
        {
            heap[i] = heap[son];
            alc = where[son];
            intr[alc] = i;
            where[i] = alc;
            i = son;
        }
        else
            son = 0;
    } while (son != 0);
    heap[i] = x;
    where[i] = ord;
    intr[ord] = i;
}
void percolate(int x, int i, int ord)
{
    int alc;
    while (i > 1 && x < heap[i / 2])
    {
        heap[i] = heap[i / 2];
        alc = where[i / 2];
        intr[alc] = i;
        where[i] = alc;
        i /= 2;
    }
    heap[i] = x;
    intr[ord] = i;
    where[i] = ord;
}
void cut(int ord)
{
    int i = intr[ord];
    heap[i] = heap[cate];
    ord = where[cate];
    intr[ord] = i;
    where[i] = ord;
    --cate;
    if (i > 1 && heap[i] < heap[i / 2])
        percolate(heap[i], i, ord);
    else
        sift(heap[i], i, ord);
}
void put(int x, int i, int ord)
{
    heap[i] = x;
    intr[ord] = i;
    where[i] = ord;
    percolate(x, i, ord);///cand inserezi valoarea e pusa tot timpul ultima si atunci compari mereu doar cu tata
}
int main()
{
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");
    int x, cod, ord = 0, which, i = 0;
    f >> n;
    for (int k = 1;k <= n;++k)
    {
        f >> cod;
        if (cod == 1)
        {
            f >> x;
            put(x, ++cate, ++ord);
        }
        else
            if (cod == 2)
            {
                f >> which;
                cut(which);
            }
            else
                g << heap[1] << "\n";
    }
    f.close();
    g.close();
    return 0;
}