Cod sursa(job #2953168)

Utilizator Iordache_CezarIordache Cezar Iordache_Cezar Data 10 decembrie 2022 16:37:52
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.01 kb
#include <fstream>
#include <map>
#define NMAX 200008
///min-heap
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");

int n;
int H[NMAX], p[NMAX], elp[NMAX], cnt;
map <int, int> M;

void creare(int H[], int& n);
void inserare(int H[], int& n, int x);
void combinare(int H[], int& n, int i);


int main()
{
    ios_base::sync_with_stdio(0); fin.tie(0);
    creare(H, n);
    return 0;
}

void creare(int H[], int& n)
{
    int nr;
    fin >> nr;
    n = 0;
    for (int i = 0; i < nr; i++)
    {
        int x, op, ok;
        fin >> op;
        if (op == 1)
        {
            fin >> x;
            M[x] = ++cnt;
            elp[cnt] = x;
            p[cnt] = n+1;
            inserare(H, n, x);
        }
        else if (op == 3)
        {
            fout << H[1] << '\n';
        }
        else
        {
            fin >> x;
            combinare(H, n, p[M[elp[x]]]);
        }
    }
}

void inserare(int H[], int& n, int x)
{
    int poz = n + 1, tpoz = poz / 2;
    while (tpoz > 0 && H[tpoz] > x)
    {
        H[poz] = H[tpoz];
        p[M[H[poz]]] = poz;
        poz = tpoz;
        tpoz = poz / 2;
    }
    H[poz] = x;
    p[M[x]] = poz;
    n++;
}

void combinare(int H[], int& n, int i)
///combin heap-urile corecte cu radacinile 2i si 2i+1 cu nodul i
{
    p[M[H[n]]] = i;
    H[i] = H[n--];
    int x = H[i], tata = i, fiu = 2*i, t = i/2;
    if (t > 0 && H[t] > x)
    {
        while (t > 0 && H[t] > x)
        {
            H[tata] = H[t];
            p[M[H[tata]]] = tata;
            tata = t;
            t = tata/2;
        }
    }
    while (fiu <= n)
    {
        ///daca exista fiu drept si e mai mic
        if (fiu + 1 <= n && H[fiu+1] < H[fiu])  fiu++;
        if (H[fiu] < x)
        {
            H[tata] = H[fiu];
            p[M[H[fiu]]] = tata;
            tata = fiu;
            fiu = fiu * 2;
        }
        else
            break;
    }
    H[tata] = x;
    p[M[x]] = tata;
}