Cod sursa(job #2894647)

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

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

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

void urca(int poz)
{
    int tata;
    while(true)
    {
        tata = (poz - 1) / 2;
        if(v[tata].first.second > v[poz].first.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].first.second;
        if(poz * 2 + 2 == v.size() || fiuSt < v[poz * 2 + 2].first.second)        //adica daca nu are fiu drept sau fiul stang e mai mare decat dreptul
        {
            if(fiuSt < v[poz].first.second)
            {
                swap(v[poz], v[poz * 2 + 1]);
                coboara(poz * 2 + 1);
            }
        }
        else if(v[poz * 2 + 2].first.second < v[poz].first.second)
        {
            swap(v[poz], v[poz * 2 + 2]);
            coboara(poz * 2 + 2);
        }
    }
}

void elimVarf()
{
    v[0] = v[v.size() - 1];
    v.pop_back();
    coboara(0);
}

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

void sterge(int poz)
{
    for(int j = 0; j < v.size(); j++)
        if(v[j].first.first == poz)
        {
            v[j].second = 0;
            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);
            while(!v.empty() && v[0].second == 0)
            elimVarf();
        }
        else
            out<<v[0].first.second<<'\n';

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

    return 0;
}