Cod sursa(job #2894644)

Utilizator mihairazvan03Dana Mihai mihairazvan03 Data 28 aprilie 2022 00:21:52
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.01 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");

vector<pair<int, int>> v;    //<index cronologic, valoare>
int i, n, op, elem, nrElem;

void urca(int poz)
{
    int tata;
    while(true)
    {
        tata = (poz - 1) / 2;
        if(v[tata].second > v[poz].second)
        {
            swap(v[tata], v[poz]);
            poz = tata;
        }
        else
            break;
    }
}

void coboara(int poz)
{
    int fiuSt;

    if(!(poz * 2 + 1 >= v.size()))      //adica fiul sau din stanga exista deci are unde cobora
    {
        fiuSt = v[poz * 2 + 1].second;
        if(poz * 2 + 2 == v.size() || fiuSt < v[poz * 2 + 2].second)        //adica daca nu are fiu drept sau fiul stang e mai mare decat dreptul
        {
            if(fiuSt < v[poz].second)
            {
                swap(v[poz], v[poz * 2 + 1]);
                coboara(poz * 2 + 1);
            }
        }
        else if(v[poz * 2 + 2].second < v[poz].second)
        {
            swap(v[poz], v[poz * 2 + 2]);
            coboara(poz * 2 + 2);
        }
    }
}

void inserare(int x, int poz)
{
    v.push_back(make_pair(poz, x));
    urca(v.size() - 1);
}

void sterge(int poz)
{
    for(int j = 0; j < v.size(); j++)
        if(v[j].first == poz)
        {
            v[j] = v[v.size() - 1];
            v.pop_back();
            coboara(j);
            urca(j);
            break;
        }
}

int main()
{
    in>>n;

    for(i = 1; i <= n; i++)
    {
        in>>op;
        if(op == 1)
        {
            in>>elem;
            nrElem++;
            inserare(elem, nrElem);
        }
        else if(op == 2)
        {
            in>>elem;
            sterge(elem);
        }
        else
            out<<v[0].second<<'\n';

       /* {for(int j = 0; j < v.size(); j++)
                cout<<v[j].second<<" "<<v[j].first<<"    ";
            cout<<endl;}*/
    }

    return 0;
}