Cod sursa(job #2811443)

Utilizator LuxinMatMatasaru Luxin Gabriel LuxinMat Data 2 decembrie 2021 11:53:34
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include<fstream>
#include<vector>
using namespace std;

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

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

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

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

void down(int pos)
{
    while(2*pos < heap.size())
    {
        int maxim = 2*pos;
        if(2*pos+1 < heap.size() && heap[2*pos] < heap[2*pos+1])
        {
            maxim = 2*pos+1;
        }
        if(heap[pos] >= heap[maxim])
        {
            break;
        }
        else
        {
            swap(heap[pos], heap[maxim]);
            swap(elem[pos], elem[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 nr)
{
    if(isempty())
    {
        cout<<"eroare- empty";
        return;
    }
    int len = elem.size();
    for(int i=1; i<len; i++)
    {
        if(nr == elem[i])
        {
            nr = i;
            break;
        }
    }
    swap(heap[nr], heap[heap.size()-1]);
    swap(elem[nr], elem[heap.size()-1]);
    heap.pop_back();
    elem.pop_back();
    if(nr > 1 && heap[nr] > heap[nr/2])
        up(nr);
    else
        down(nr);
}

int top()
{
    if(isempty())
    {
        cout<<"eroare- empty";
        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;
            ins(-nr);
        }
        if(op == 2)
        {
            cin>>nr;
            pop(nr);
        }
        if(op == 3)
        {
            cout<<(-1)*top()<<'\n';
        }
    }
    return 0;
}