Cod sursa(job #3320959)

Utilizator ZsomborZsombor Horvay Zsombor Data 7 noiembrie 2025 19:00:04
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.31 kb
#include <fstream>
#include <vector>
#include <utility>
#include <climits>

using namespace std;

ifstream be("heapuri.in");
ofstream ki("heapuri.out");

void up(vector<pair<int, int>> &h, vector<int> &order, int pos)
{
    if(pos == 0)
    {
        return;
    }

    int dad = (pos - 1) / 2;

    if(h[dad].first > h[pos].first)
    {
        swap(h[dad], h[pos]);
        swap(order[h[dad].second], order[h[pos].second]);

        up(h, order, dad);
    }

    return;
}

void down(vector<pair<int, int>> &h, vector<int> &order, int pos)
{
    int children1 = 2 * pos + 1;

    if(children1 > (int)h.size() - 1)
    {
        return;
    }

    int children2 = 2 * pos + 2;

    if(children2 > (int)h.size() - 1)
    {
        if(h[children1].first < h[pos].first)
        {
            swap(h[children1], h[pos]);
            swap(order[h[children1].second], order[h[pos].second]);

            down(h, order, children1);
        }
    }else
    {
        int min_children = children2;

        if(h[children1].first < h[children2].first)
        {
            min_children = children1;
        }

        if(h[min_children].first < h[pos].first)
        {
            swap(h[min_children], h[pos]);
            swap(order[h[min_children].second], order[h[pos].second]);

            down(h, order, min_children);
        }
    }
    
    return;
}

void betesz(vector<pair<int, int>> &h, vector<int> &order, int x)
{
    h.push_back({x, order.size()});
    order.push_back(h.size() - 1);

    up(h, order, (int)h.size() - 1);
}

void kivesz(vector<pair<int, int>> &h, vector<int> &order, int cron)
{
    h[order[cron]] = h.back();
    order[h.back().second] = order[cron];
    h.pop_back();

    down(h, order, order[cron]);
    up(h, order, order[cron]);
}

int main()
{
    int n;
    be >> n;

    int t;

    vector<pair<int, int>> h;
    vector<int> order;

    for(int i = 0; i < n; i++)
    {
        be >> t;

        if(t == 1)
        {
            int x;
            be >> x;

            betesz(h, order, x);
        }else if(t == 2)
        {
            int x;
            be >> x;
            x--;

            kivesz(h, order, x);
        }else
        {
            ki << h[0].first << "\n";
        }
    }

    return 0;
}