Cod sursa(job #2894661)

Utilizator mihairazvan03Dana Mihai mihairazvan03 Data 28 aprilie 2022 00:50:54
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.56 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>
vector<int> pozIndici;        //retinem pozitiile pe care se afla in heap fiecare indice ca sa nu mai cautam, sunt mai 200k operatii deci max 200k indici
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]);
            pozIndici[v[tata].first] = tata;
            pozIndici[v[poz].first] = poz;
            poz = tata;
        }
        else
        {
            pozIndici[v[poz].first] = poz;
            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]);
                pozIndici[v[poz * 2 + 1].first] = poz * 2 + 1;
                pozIndici[v[poz].first] = poz;
                coboara(poz * 2 + 1);
            }
            else
                pozIndici[v[poz].first] = poz;
        }
        else if(v[poz * 2 + 2].second < v[poz].second)
        {
            swap(v[poz], v[poz * 2 + 2]);
            pozIndici[v[poz * 2 + 2].first] = poz * 2 + 2;
            pozIndici[v[poz].first] = poz;
            coboara(poz * 2 + 2);
        }
        pozIndici[v[poz].first] = poz;
    }
}

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

void sterge(int indice)
{
    int poz = pozIndici[indice];
    v[poz] = v[v.size() - 1];
    v.pop_back();
    coboara(poz);
    urca(poz);

}

int main()
{
    in>>n;
    pozIndici.resize(n + 1);

    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;
}