Cod sursa(job #2465318)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 29 septembrie 2019 20:17:34
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>

using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");

const int NMAX = 2e5 + 5;

int Q, N, Type, cnt;

pair <int, int > Heap[NMAX];

bool Sel[NMAX];

static inline void Heap_Up (int pos)
{
    if(pos == 1)
        return;

    int T = pos / 2;

    if(Heap[pos].first < Heap[T].first)
    {
        swap(Heap[pos], Heap[T]);

        Heap_Up(T);
    }

    return;
}

static inline void Heap_Down (int pos, int N)
{
    int Left = 1e9 + 1, Right = 1e9 + 1;

    if(2 * pos <= N)
        Left = Heap[2 * pos].first;

    if(2 * pos + 1 <= N)
        Right = Heap[2 * pos + 1].first;

    if(Heap[pos].first < min(Left, Right))
        return;

    if(Left == min(Left, Right))
    {
        swap(Heap[pos], Heap[2 * pos]);

        Heap_Down(2 * pos, N);

        return;
    }

    swap(Heap[pos], Heap[2 * pos + 1]);

    Heap_Down(2 * pos + 1, N);

    return;
}

int main()
{
    f.tie(NULL);

    f >> Q;

    for(int i = 1; i <= Q; ++i)
    {
        f >> Type;

        if(Type == 1)
        {
            int X = 0;

            f >> X;

            ++N;

            Heap[N] = {X, ++cnt};

            Heap_Up(N);
        }
        else
        {
            if(Type == 2)
            {
                int X = 0;

                f >> X;

                Sel[X] = true;
            }
            else
            {
                while(Sel[Heap[1].second] == true)
                {
                    swap(Heap[1], Heap[N]);
                    Heap[N].first = 1e9 + 1;

                    Heap_Down(1, N);

                    --N;
                }

                g << Heap[1].first << '\n';
            }
        }
    }

    return 0;
}