Cod sursa(job #2811906)

Utilizator LuxinMatMatasaru Luxin Gabriel LuxinMat Data 3 decembrie 2021 15:53:38
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 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 minim = 2*pos;
        if(2*pos+1 < heap.size() && v[heap[2*pos]] > v[heap[2*pos+1]])
        {
            minim = 2*pos+1;
        }
        if(v[heap[pos]] <= v[heap[minim]])
        {
            break;
        }
        else
        {
            swap(heap[pos], heap[minim]);
            swap(elem[heap[pos]], elem[heap[minim]]);
            pos = minim;
        }
    }
}

void ins(int nr)
{
    heap.push_back(nr);
    elem.push_back(heap.size()-1);
    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]] = 0;
    heap.pop_back();
    up(nr);
    down(nr);
}

int top()
{
    if(isempty())
    {
        return 0;
    }
    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;
}