Cod sursa(job #1583533)

Utilizator Leonard1998Olariu Leonard Leonard1998 Data 29 ianuarie 2016 00:47:04
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <algorithm>
#define DMAX 200001

using namespace std;

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

int n, i, op, x;
int poz[DMAX];
struct elem {int inf; int poz;} H[DMAX];

void inserare (int);
void urc_elem (int);
void cobor_elem (int);

int main()
{
    fin >> n;
    for (i = 1; i <= n; i++)
    {
        fin >> op;
        if (op == 1)
        {
            fin >> x; poz[0]++;
            inserare (x);
        }
        else if (op == 2)
            {
                fin >> x;
                H[poz[x]].inf = -1000000000;
                urc_elem (poz[x]);

                H[1] = H[H[0].inf]; poz[H[1].poz] = 1; H[0].inf--;
                cobor_elem (1);
            }
            else fout << H[1].inf << '\n';
    }
    return 0;
}

void inserare (int inf)
{
    int fiu, tata;
    fiu = ++H[0].inf;
    tata = fiu/2;

    while (tata && H[tata].inf > inf)
    {
        H[fiu] = H[tata]; poz[H[fiu].poz] = fiu;
        fiu = tata;
        tata /= 2;
    }

    H[fiu].inf = inf;
    H[fiu].poz = poz[0];
    poz[poz[0]] = fiu;
}

void urc_elem (int i)
{
    int fiu = i, tata = i/2;
    while (tata)
    {
        swap (H[fiu], H[tata]);
        swap (poz[H[fiu].poz], poz[H[tata].poz]);
        fiu = tata; tata = fiu/2;
    }
}

void cobor_elem (int i)
{
    int inf = H[i].inf, tata = i, fiu = 2*i;
    while (fiu <= H[0].inf)
    {
        if (fiu+1 <= H[0].inf && H[fiu].inf > H[fiu+1].inf) fiu++;
        // fiu indica cel mai mic dintre fii
        if (H[fiu].inf < inf)
        {
            swap (H[tata], H[fiu]);
            swap (poz[H[tata].poz], poz[H[fiu].poz]);
            tata = fiu;
            fiu = 2*tata;
        }
        else break;
    }
}