Cod sursa(job #2724769)

Utilizator alessiamtr12Mitrica Alessia alessiamtr12 Data 17 martie 2021 19:48:01
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>

using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n,m,poz[200001],op,x,y;
struct nod
{
    int val,nr_ord;
}v[200001];
void adaug(int k)
{
    while(k>1&&v[k].val<v[k/2].val)
    {
        swap(v[k],v[k/2]);
        swap(poz[v[k].nr_ord],poz[v[k/2].nr_ord]);
        k/=2;
    }
}
void sterg(int k)
{
    while(2*k<=m)
    {
        int fiumax=2*k;
        if(2*k+1<=m&&v[2*k].val>v[2*k+1].val)
        {
            fiumax=2*k+1;
        }
        if(v[k].val>v[fiumax].val)
        {
            swap(v[k],v[fiumax]);
            swap(poz[v[k].nr_ord],poz[v[fiumax].nr_ord]);
            k=fiumax;
        }
        else
            break;
    }
}
int main()
{
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>op;
        if(op==1)
        {
            fin>>x;
            v[++m].val=x;
            v[m].nr_ord=++y;
            poz[y]=m;
            adaug(m);
        }
        else
            if(op==2)
        {
            fin>>x;
            v[poz[x]].val=v[m].val;
            poz[v[m].nr_ord]=poz[x];
            m--;
            sterg(poz[x]);
            adaug(poz[x]);
        }
        else
            fout<<v[1].val<<"\n";
    }
    return 0;
}