Cod sursa(job #2964786)

Utilizator stefan05Vasilache Stefan stefan05 Data 13 ianuarie 2023 22:10:24
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <fstream>

#define NMAX 200005

using namespace std;

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

struct Heap
{
    int val, ord;
};

int nr, n;
Heap h[NMAX]; int poz[NMAX];
int c, x, counter;
int i;

void insertHeap(Heap [], int&, int, int);
void stergeHeap(Heap [], int&, int);
void combHeap(Heap [], int, int);
int minimHeap(Heap [], int);
void afisareHeap(Heap [], int);

int main()
{
    fin >>nr;
    for (i = 1; i <= nr; ++i)
    {
        fin >>c;
        switch(c)
        {
        case 1:
            fin >>x; counter++;
            insertHeap(h, n, x, counter);
            break;

        case 2:
            fin >>x;
            stergeHeap(h, n, poz[x]);
            break;

        case 3:
            fout <<minimHeap(h, n)<<'\n';
            break;
        }
    }

    fout.close();
    return 0;
}

void insertHeap(Heap h[], int &n, int x, int nr)
{
    int fiu = ++n;
    int tata = fiu/2;
    while (tata && h[tata].val > x)
    {
        h[fiu] = h[tata]; poz[h[tata].ord] = fiu;
        fiu = tata;
        tata = fiu/2;
    }
    h[fiu].val = x; h[fiu].ord = nr;
    poz[h[fiu].ord] = fiu;
}

void stergeHeap(Heap h[], int &n, int x)
{
    h[x] = h[n]; poz[h[n].ord] = x;
    n--;

    combHeap(h, n, x);
}

void combHeap(Heap h[], int n, int x)
{
    int val = h[x].val; int ord = h[x].ord;
    int tata = x, fiu = 2*x;

    while (fiu <= n)
    {
        if (fiu < n)
            if (h[fiu].val > h[fiu+1].val)
                fiu ++;

        if (val > h[fiu].val)
        {
            h[tata] = h[fiu]; poz[h[fiu].ord] = tata;
            tata = fiu;
            fiu = tata*2;
        }
        else fiu = n+1;
    }

    h[tata].val = val; h[tata].ord = ord;
    poz[h[tata].ord] = tata;
}

int minimHeap(Heap h[], int n)
{
    return h[1].val;
}

void afisareHeap(Heap h[], int n)
{
    int i;
    for (i = 1; i <= n; ++i)
        fout <<h[i].val<<' ';
    fout <<'\n';
}