Cod sursa(job #2270612)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 27 octombrie 2018 11:52:49
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#define INF 1000000006
using namespace std;

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

int q, tip, val, n, k, aux;

int H[200005];

int v[200005];

bool used[200005];

void HeapUp (int x)
{
    if (x > 1)
    {
        if (v[H[x]] < v[H[x / 2]])
        {
            swap(H[x], H[x / 2]);
            HeapUp(x / 2);
        }
    }
}

void HeapDown (int x, int aux)
{
    int st, dr;
    if (2 * x <= aux)
    {
        st = v[H[2 * x]];
        if (2 * x + 1 <= aux)
            dr = v[H[2 * x + 1]];
        else dr = st + 1;

        if (min(st, dr) < v[H[x]])
        {
            if (st < dr)
            {
                swap(H[x], H[2*x]);
                HeapDown(2 * x, aux);
            }
            else
            {
                swap(H[x], H[2 * x + 1]);
                HeapDown(2 * x + 1, aux);
            }
        }
    }
}
int main()
{
    f >> q;

    for (; q; q--)
    {
        f >> tip;

        if (tip == 1)
        {
            f >> val;
            n++;
            aux++;
            v[n] = val;
            H[aux] = n;
            HeapUp(aux);
        }
        else if (tip == 2)
        {
            f >> val;
            used[val] = true;
        }
        else
        {
            while (used[H[1]] == true)
            {
                swap(H[1], H[aux]);
                aux--;
                HeapDown(1, aux);
            }

            g << v[H[1]] << '\n';
        }
    }
    return 0;
}