Cod sursa(job #1583427)

Utilizator Leonard1998Olariu Leonard Leonard1998 Data 28 ianuarie 2016 22:51:46
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#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 combinare (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]] = H[H[0].inf]; H[0].inf--;
                combinare (poz[x]);
            }
            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 combinare (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)
        {
            H[tata] = H[fiu];
            tata = fiu;
            fiu = 2*tata;
        }
        else break;
    }
    H[tata].inf = inf;
}