Cod sursa(job #3252840)

Utilizator ElideMaria Popescu Elide Data 31 octombrie 2024 12:26:05
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 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(nod > 1 && h[nod].val < h[nod/2].val)
    {
        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, nr_elem = 0;
    in >> n;
    for(i = 1; i <= n; i++)
    {
        in >> operatie;
        if(operatie == 1)
        {
            in >> nr;
            nr_elem++;
            add(nr, nr_elem);
            //out << "Am adaugat elementul " << nr << '\n';
            continue;
        }
        if(operatie == 2)
        {
            in >> poz;
            //out << "Am sters elementul " << h[v_poz[poz]].val << '\n';
            del(poz);
            continue;
        }
        out << h[1].val << '\n';
    }
    return 0;
}