Cod sursa(job #3174995)

Utilizator dimitriemihaiMihai Dimitrie dimitriemihai Data 25 noiembrie 2023 11:20:59
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>
#define NM 200002

using namespace std;

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

int n, H[NM], m, poz[NM];

void afisare()
{
    int i;
    for (i=1; i<=n; i++)
        cout << poz[i] << ' ';
    cout << '\n';
}
void combinare (int p);
void inserare(int x);
void stergere (int i);

int main()
{
    fin >> m;
    int i, c, x;
    for (i=1; i<=m; i++)
    {
        fin >> c;

        if (c == 1)
        {
            fin >> x;
            inserare(x);
        }

        if (c == 2)
        {
            fin >> x;
            stergere(x);
        }

        if (c == 3)
        {
            fout << H[1] << '\n';
        }

        //afisare();
    }
    return 0;
}

void inserare (int x)
{
    int fiu, tata;
    fiu = n+1;
    tata = fiu/2;

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

    n ++;
    H[fiu] = x;
    poz[fiu] = n;
}

void stergere (int i)
{
    int cnt;
    for (int j = 1; j <= n; j ++)
        if (poz[j] == i)
        {
            cnt = j;
            break;
        }
    H[cnt] = H[n--];
    combinare(cnt);
}

void combinare (int p)
{
    int tata, fiu, x;
    x = H[p];
    tata = p;
    fiu = 2*tata;

    while (fiu <= n)
    {
        if (fiu+1 <= n && H[fiu+1] < H[fiu])fiu++;

        if (H[fiu] < x)
        {
            H[tata] = H[fiu];
            poz[tata]= poz[fiu];
            tata = fiu;
            fiu = 2*tata;
        }
        else break;
    }

    H[tata] = x;
    poz[tata] = poz[x];
}