Cod sursa(job #2724728)

Utilizator Edyci123Bicu Codrut Eduard Edyci123 Data 17 martie 2021 18:33:06
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");

struct elem
{
    int val;
    int nrOrd;
}v[200005];
int poz[200005], q, n, ops;

void Up(int k)
{
    while(k > 1 && v[k].val < v[k / 2].val)
    {
        swap(poz[v[k].nrOrd], poz[v[k / 2].nrOrd]);
        swap(v[k], v[k / 2]);
        k /= 2;
    }
}

void Down(int k)
{
    while(2 * k <= n)
    {
        int newK = 2 * k;
        if(newK + 1 <= n && v[newK].val > v[newK + 1].val)
            newK++;
        if(v[k].val > v[newK].val)
        {
            swap(poz[v[k].nrOrd], poz[v[newK].nrOrd]);
            swap(v[k], v[newK]);
            k = newK;
        }
        else
            return ;
    }
}

int main()
{
    f >> q;
    for(; q; q--)
    {
        int task;
        f >> task;
        if(task == 1)
        {
            int x;
            f >> x;
            v[++n] = {x, ++ops};
            poz[ops] = n;
            Up(n);
        }
        if(task == 2)
        {
            int x;
            f >> x;
            v[poz[x]] = v[n], n--;
            Down(poz[x]);
        }
        if(task == 3)
        {
            g << v[1].val << "\n";
        }
    }

    return 0;
}