Cod sursa(job #2895922)

Utilizator SteanfaDiaconu Stefan Steanfa Data 29 aprilie 2022 16:51:19
Problema Heapuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.38 kb

#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

vector<pair<long long , long long >> v;
vector<long long > p;

void afisare(vector<long long > v)
{
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
}
void fini()
{
    cout << "\n----------\n-p--";
    afisare(p);
    cout << "\n-h--";
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i].first << "<->" << v[i].second << " ";
    }
    cout << "\n----------\n";
}
void schimb(long long  old, long long  neww)
{
    swap(v[old], v[neww]);
    swap(p[v[old].second], p[v[neww].second]);
}
void sus(long long pozitie)
{
    while ((pozitie - 1) / 2 >= 0 and v[(pozitie - 1) / 2].first > v[pozitie].first)
    {
        schimb((pozitie - 1) / 2, pozitie);
        pozitie = (pozitie - 1) / 2;
    }
}

void jos(long long  pozitie)
{
    if (v.size() <= pozitie * 2 + 1)
    {
        return;
    }
    long long  pozMin = pozitie * 2 + 1;
    if (v.size() > pozitie * 2 + 2)
    {
        pozMin = (v[pozitie * 2 + 1].first < v[pozitie * 2 + 2].first) ? pozitie * 2 + 1 : pozitie * 2 + 2;
    }
    if (v[pozitie].first < v[pozMin].first)
        return;
    schimb(pozitie, pozMin);
    jos(pozitie);
}

int  main()
{
    ifstream cin("heapuri.in");
    ofstream cout("heapuri.out");
    // ifstream cin("../../Downloads/grader_test1.in");
    // ifstream cin("grader_test2.in");
    // ifstream cin("dec.py");
    long long  n, rdcn, pozSterge, lgr, mrm;
    cin >> n;

    long long  x = 0, add, pozz;
    for (long long  i = 0; i < n; i++)
    {

        cin >> lgr;
        // cout << i << ' ' << lgr << endl;
        if (lgr == 1)
        {
            cin >> add;
            v.push_back(make_pair(add, x));
            p.push_back(x);
            sus(v.size() - 1);
            x++;
        }
        else if (lgr == 2)
        {
            cin >> pozSterge;
            pozSterge--;
            if (p[pozSterge] == v.size() - 1)
            {
                // p[pozSterge] = -1;
                v.pop_back();
                continue;
            }

            pozz = p[pozSterge];
            p[v.back().second] = p[pozSterge];
            v[pozz] = v.back();
            v.pop_back();
            // p[pozSterge] = -1;
            sus(pozz);
            jos(pozz);
        }
        else
        {
            cout << v[0].first << "\n";
        }
    }
    // fini();
}