Cod sursa(job #2724239)

Utilizator cameleonGeorgescu Dan cameleon Data 16 martie 2021 19:38:01
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
using namespace std;
#define NMAX 200005

ifstream cin("heapuri.in");
ofstream cout("heapuri.out");

struct elem
{
    int val, idx;
};

elem h[NMAX];
int poz[NMAX],n;

void urc(int k)
{
    while(k>1 && h[k].val < h[k/2].val)
    {
        poz[h[k].idx]=k/2;
        poz[h[k/2].idx]=k;
        swap(h[k],h[k/2]);

        k=k/2;
    }
}

void cobor(int k)
{
    int fiumin;
    while(2*k <= n)
    {
        fiumin=2*k;
        if(2*k+1<=n && h[2*k+1].val<h[fiumin].val)
            fiumin=2*k+1;

        if(h[k].val > h[fiumin].val)
        {
            poz[h[fiumin].idx]=k;
            poz[h[k].idx]=fiumin;
            swap(h[k],h[fiumin]);
            k=fiumin;
        }
        else
            break;
    }
}

int main()
{
    int op, x, m, nr_ord=0;
    cin>>m;
    for(;m;m--)
    {
        cin>>op;
        if(op==1)
        {
            cin>>x;
            n++; nr_ord++;
            h[n].val=x;h[n].idx=nr_ord;
            poz[nr_ord]=n;
            urc(n);
        }
        if(op==2)
        {
            cin>>x;
            int p=poz[x];

            poz[h[n].idx]= p;
            poz[h[p].idx]=-1;

            swap(h[p],h[n]);
            n--;
            cobor(p);
        }
        if(op==3)
            cout<<h[1].val<<"\n";
    }

    return 0;
}