Cod sursa(job #2581428)

Utilizator MirunaStefaniaLupascu Miruna-Stefania MirunaStefania Data 15 martie 2020 11:45:37
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <iostream>
#include<fstream>
#define N 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int h[N];//HEAP MIN
int poz[N];//poz[i]-j -->elementul intrat al i lea acum se afla pe poz j
int m;//nr operatii
int n;//lg heap

void heapup(int nod)
{
    int i;
    while(nod > 1 && h[nod] < h[nod/2])
    {
        swap(h[nod], h[nod/2]);
        swap(poz[nod], poz[nod/2]);
        nod = nod / 2;
    }
}

void add(int val)
{
    h[++n] = val;
    poz[n]=n;
    heapup(n);
}

inline int left(int nod)//returneaza poz fiu stanga
{
    return 2*nod;
}

inline int right(int nod)
{
    return 2 * nod + 1;
}

void heapdown(int nod)
{
    int son;
    do
    {
        son=0;
        if(left(nod) <= nod)//daca are cel putin un fiu
        {
            son = left(nod);//pp ca el este mai mic
            if(right(nod) && h[right(nod)] <= h[left(nod)])//daca are si fiu dreapta care este mai mic
                son=right(nod);

            //daca minimul dintre cei 2 fii este tot mai mare nu mai avem unde cobori
            if(h[son] >= h[nod])son=0;
        }
        if(son)
            {
                swap(h[nod], h[son]);
                swap(poz[nod], poz[son]);

                nod = son; /// ?????????????????????????????
            }


    }while(son);
}

void solve3()
{
    fout << h[1] << " " ;//minimul
    /*h[1]=h[n--];
    heapdown(1);*/
}

void sterge(int x)
{
    //cel intrat al xlea se afla pe poz poz[x]
    x = poz[x];
    h[x] = h[n--];
    //vedem daca trebuie urcat sau coborat
    if(x>1 && h[x] < h[x / 2])
        heapup(x);
    else heapdown(x);

}


int main()
{
    int i, op, x;
    fin >> m;
    for(i = 1; i <= m; ++i)
    {
        fin >> op;
        if(op == 1)
        {
            fin >> x;
            add(x);
        }
        if(op == 2)
        {
            fin >> x;
            sterge(x);
        }
        if(op == 3)
            solve3();
    }
    /*for(i = 1; i <= n; ++i)
        fout << h[i] << " ";*/

    return 0;
}