Cod sursa(job #2586164)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 19 martie 2020 21:28:09
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.35 kb
#include <bits/stdc++.h>
#define MAX 200000 + 5

using namespace std;

struct HeapElem
{
    int id;
    int val;
}Heap[MAX];

int n, m, cnt, elemHeap[MAX];

inline int father(int k)
{
    return k >> 1;
}

inline int left_son(int k)
{
    return k << 1;
}
inline int right_son(int k)
{
    return (k << 1) + 1;
}

inline int top_heap()
{
    return Heap[1].val;
}

void percolate(int k)
{
    HeapElem key = Heap[k];

    while(k > 1 && Heap[father(k)].val > key.val)
    {
        int fatherId = Heap[father(k)].id;

        elemHeap[fatherId] = k;
        Heap[k] = Heap[father(k)];
        k = father(k);
    }

    Heap[k] = key;
    elemHeap[key.id] = k;
}

void sift(int k)
{
    int son;

    do
    {
        son = 0;

        if(left_son(k) <= n)son = left_son(k);
        if(right_son(k) <= n && Heap[son].val > Heap[right_son(k)].val)son = right_son(k);

        if(son && Heap[k].val > Heap[son].val)
        {
            swap(Heap[k], Heap[son]);
            swap(elemHeap[Heap[k].id], elemHeap[Heap[son].id]);
            k = son;
        }
    }while(son);
}

void add_element(int k)
{
    n++;
    cnt++;

    elemHeap[cnt] = n;
    Heap[n].id = cnt;
    Heap[n].val = k;

    percolate(n);
}

void cut_element(int id)
{
    int pozHeap = elemHeap[id];

    Heap[pozHeap] = Heap[n];
    elemHeap[Heap[n].id] = pozHeap;
    n--;

    if(pozHeap > 1 && Heap[pozHeap].val > Heap[father(pozHeap)].val)percolate(pozHeap);
    else
    {
       // cout << "am intrat in sift" << '\n';
        sift(pozHeap);
    }
}

void afisareHeap()
{
    for(int i = 1; i <= n; i++)cout << Heap[i].val << " ";
    cout << '\n';
}

int main()
{
    ifstream fin("heapuri.in");
    ofstream fout("heapuri.out");

    ios::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);

    fin >> m;

    for(int i = 1; i <= m; i++)
    {
        int op;

        fin >> op;

        if(op == 1)
        {
            int elem;

            fin >> elem;
            add_element(elem);

          //  afisareHeap();
        }
        else if(op == 2)
        {
            int id;

            fin >> id;
            cut_element(id);
           // afisareHeap();
        }
        else fout << top_heap() << '\n';
    }

    fin.close();
    fout.close();

    return 0;
}