Cod sursa(job #3318259)

Utilizator ZsomborZsombor Horvay Zsombor Data 27 octombrie 2025 18:08:04
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.37 kb
#include <fstream>
#include <vector>
#include <utility>
#include <climits>

using namespace std;

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

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

    int t, x;

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

    int size = 0;

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

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

            h.push_back({x, size});
            order.push_back(size);

            int k = (size - 1) / 2;
            int current = size;

            while(current > 0)
            {
                if(h[k] < h[current])
                {
                    swap(h[k], h[current]);
                    swap(order[h[k].second], order[h[current].second]);
                }else
                {
                    break;
                }

                current = k;
                k = (current - 1) / 2;
            }

            size++;
        }else if(t == 2)
        {
            be >> x;
            x--;

            h[order[x]] = h.back();
            order[h.back().second] = order[x];

            h.pop_back();
            size--;

            int k = order[x];

            while(2 * k + 1 < size)
            {
                int c1 = 2 * k + 1;

                int c2 = -1;
                if(2 * k + 2 < size)
                {
                    c2 = 2 * k + 2;
                }

                int maximum;

                if(c2 == -1 || h[c1] >= h[c2])
                {
                    maximum = c1;
                }else
                {
                    maximum = c2;
                }

                if(h[maximum] > h[k])
                {
                    swap(h[maximum], h[k]);
                    swap(order[h[maximum].second], order[h[k].second]);
                }else
                {
                    break;
                }

                if(maximum == c1)
                {
                    k = 2 * k + 1;
                }else
                {
                    k = 2 * k + 2;
                }
            }
        }else
        {
            int minimum = INT_MAX;

            for(pair<int, int> i : h)
            {
                minimum = min(minimum, i.first);
            }

            ki << minimum << "\n";
        }
    }

    return 0;
}