Cod sursa(job #3252823)

Utilizator ElideMaria Popescu Elide Data 31 octombrie 2024 12:02:37
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>

using namespace std;

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

struct heap
{
    int val, poz_cit;
}h[200005];

int v_poz[200005], nr_nod;

void my_swap(int nod_1, int nod_2)
{
    swap(v_poz[h[nod_1].poz_cit], v_poz[h[nod_2].poz_cit]);
    swap(h[nod_1], h[nod_2]);
}

void up(int nod)
{
    while(h[nod].val < h[nod/2].val && nod > 1)
    {
        my_swap(nod, nod/2);
        nod /= 2;
    }
}

void down(int nod)
{
    while(nod*2 <= nr_nod)
    {
        int fiu_min = nod*2;
        if(nod*2+1 <= nr_nod && h[nod*2].val > h[nod*2+1].val)
        {
            fiu_min = nod*2+1;
        }
        if(h[nod].val > h[fiu_min].val)
        {
            my_swap(nod, fiu_min);
            nod = fiu_min;
        } else
        {
            break;
        }
    }
}

void add(int nr, int poz)
{
    nr_nod++;
    h[nr_nod].val = nr;
    h[nr_nod].poz_cit = poz;
    v_poz[poz] = nr_nod;
    up(nr_nod);
}

void del(int poz)
{
    int nod = v_poz[poz];
    if(v_poz[poz] == nr_nod)
    {
        nr_nod--;
        return;
    }
    my_swap(v_poz[poz], nr_nod);
    nr_nod--;
    up(nod);
    down(nod);
}

int main()
{
    int n, i, operatie, nr, poz;
    in >> n;
    for(i = 1; i <= n; i++)
    {
        in >> operatie;
        if(operatie == 1)
        {
            in >> nr;
            add(nr, i);
            continue;
        }
        if(operatie == 2)
        {
            in >> poz;
            del(poz);
            continue;
        }
        out << h[1].val << '\n';
    }
    return 0;
}