Cod sursa(job #2811525)

Utilizator LuxinMatMatasaru Luxin Gabriel LuxinMat Data 2 decembrie 2021 14:36:26
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include<fstream>
#include<vector>
using namespace std;

ifstream cin("heapuri.in");
ofstream cout("heapuri.out");

vector<int> heap(1, 0), elem(1, 0), v(1, 0);

bool isempty()
{
    return heap.size() == 1;
}

void up(int pos)
{
    if(isempty())
    {
        return;
    }
    while(pos > 1 && v[heap[pos]] < v[heap[pos/2]])
    {
        swap(heap[pos], heap[pos/2]);
        swap(elem[heap[pos]], elem[heap[pos/2]]);
        pos /= 2;
    }
}

void down(int pos)
{
    while(2*pos < heap.size())
    {
        int maxim = 2*pos;
        if(2*pos+1 < heap.size() && v[heap[2*pos]] > v[heap[2*pos+1]])
        {
            maxim = 2*pos+1;
        }
        if(v[heap[pos]] <= v[heap[maxim]])
        {
            break;
        }
        else
        {
            swap(heap[pos], heap[maxim]);
            swap(elem[heap[pos]], elem[heap[maxim]]);
            pos = maxim;
        }
    }
}

void ins(int nr)
{
    heap.push_back(nr);
    elem.push_back(elem.size());
    if(!isempty())
        up(heap.size()-1);
}

void pop(int x)
{
    if(isempty())
    {
        return;
    }
    int nr = elem[x];
    swap(heap[nr], heap[heap.size()-1]);
    swap(elem[heap[nr]], elem[heap[heap.size()-1]]);
    elem[heap[heap.size()-1]] = -1;
    heap.pop_back();
    if(nr > 1 && v[heap[nr]] < v[heap[nr/2]])
        up(nr);
    else
        down(nr);
}

int top()
{
    if(isempty())
    {
        return -1;
    }
    return heap[1];
}

int main()
{
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        int op, nr;
        cin>>op;
        if(op == 1)
        {
            cin>>nr;
            v.push_back(nr);
            ins(v.size()-1);
        }
        if(op == 2)
        {
            cin>>nr;
            pop(nr);
        }
        if(op == 3)
        {
            cout<<v[top()]<<'\n';
        }
    }
    return 0;
}