Cod sursa(job #2322748)

Utilizator DavidLDavid Lauran DavidL Data 18 ianuarie 2019 11:48:14
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fi("heapuri.in");
ofstream fo("heapuri.out");

const int NMAX = (2e5) + 5;

int q;
int H[NMAX], key[NMAX]; /// key[i] = cheia celui intrat al i-lea
int inv[NMAX]; /// al catulea a intrat cel cu cheia i
int k, n;

void interschimba(int a, int b)
{
    swap(H[a], H[b]);
    int orda = inv[a], ordb = inv[b];
    swap(inv[a], inv[b]);
    swap(key[orda], key[ordb]);
}

void coboara(int ch)
{
    if ((H[ch * 2] < H[ch] && ch * 2 <= k) || (H[ch * 2 + 1] < H[ch] && ch * 2 + 1 <= k))
    {
        if (H[ch * 2] < H[ch * 2 + 1] || ch * 2 + 1 > k)
        {
            interschimba(ch, ch * 2);
            coboara(ch * 2);
        }
        else
        {
            interschimba(ch, ch * 2 + 1);
            coboara(ch * 2 + 1);
        }
    }
    return;
}

void urca(int ch)
{
    if (ch > 1 && H[ch / 2] > H[ch])
    {
        interschimba(ch, ch / 2);

        ch = ch / 2;

        urca(ch);
    }
}

void baga(int x)
{
    k++;
    n++;

    H[k] = x;
    key[n] = k;
    inv[k] = n;

    urca(k);
}

void sterge(int cheie)
{
    interschimba(cheie, k);
    k--;

    urca(cheie);
    coboara(cheie);
}

int main()
{
    fi >> q;
    for (int i = 1; i <= q; i++)
    {
        int op, x;
        fi >> op;
        if (op == 1)
        {
            fi >> x;
            baga(x);
        }
        else if (op == 2)
        {
            fi >> x;
            sterge(key[x]);
        }
        else
        {
            fo << H[1] << "\n";
        }
    }

    return 0;
}