Cod sursa(job #3220316)

Utilizator gianiferSpita Alexandru-Mihai gianifer Data 3 aprilie 2024 10:00:02
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.32 kb

#include <bits/stdc++.h>

using namespace std;

ifstream fin("heapuri.in");

ofstream fout("heapuri.out");

int salvare_pozitie[200005];
int salvare_pozitie_introducere[200005];
int heap[200005];

int op;
int n, k, m;
void make_heap(int nod)
{
    while (nod > 1)
    {
        int p = nod / 2;
        if (heap[p] < heap[nod])
            return;
        else
        {
            swap(heap[p], heap[nod]);
            salvare_pozitie[salvare_pozitie_introducere[p]]=nod;
            salvare_pozitie[salvare_pozitie_introducere[nod]]=p;
            swap(salvare_pozitie_introducere[p],salvare_pozitie_introducere[nod]);
            nod = p;
        }
    }
}
void remake_heap(int nod)
{
    while (2 * nod <= k)
    {
        int p = 2 * nod;
        if (p + 1 <= k && heap[p + 1] < heap[p])
            p++;
        if (heap[nod] < heap[p])
            return;
        else
        {
            swap(heap[nod], heap[p]);
           salvare_pozitie[salvare_pozitie_introducere[p]]=nod;
            salvare_pozitie[salvare_pozitie_introducere[nod]]=p;
            swap(salvare_pozitie_introducere[p],salvare_pozitie_introducere[nod]);
            nod=p;
        }
    }
}
int main()
{
    fin >> m;
    for (; m--;)
    {
        fin >> op;
        if (op == 1)
        {
            int x;
            n++;
            k++;
            fin >> x;
            salvare_pozitie[n] = k;
            ///salvez pozitia elementului ce a fost introdus la momentul n
            salvare_pozitie_introducere[k] = n;
            ///salvez momentul la care a fost introdus elementul de pe pozitia k
            heap[k] = x;
            make_heap(k);
            ///adaug in heap
        }
        else if (op == 2)
        {
            int x;
            fin >> x;
            /*for(int i=1;i<=n;i++)
            cout<<salvare_pozitie_introducere[i]<<" ";
            cout<<'\n';*/
            heap[salvare_pozitie[x]] = heap[k];
           ///schimb elementul ce a fost introdus la momentul x
           swap(salvare_pozitie_introducere[salvare_pozitie[x]],salvare_pozitie[salvare_pozitie_introducere[k]]);
           ///cout<<salvare_pozitie[x]<<" ";
           ///cout<<'\n';
            k--;
            remake_heap(salvare_pozitie[x]);

        }
        else fout<<heap[1]<<'\n';
    }
}