Cod sursa(job #2586152)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 19 martie 2020 21:06:57
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.33 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)
    {
        Heap[k] = Heap[father(k)];
        elemHeap[Heap[k].id] = elemHeap[Heap[father(k)].id];
        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)
{
    Heap[elemHeap[id]] = Heap[n];
    elemHeap[Heap[n].id] = elemHeap[id];
    n--;

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

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