Cod sursa(job #2371477)

Utilizator CodCatalinCodreanu Catalin CodCatalin Data 6 martie 2019 17:49:20
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <vector>
#define Nrp 10007
using namespace std;

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

int n,nr,m,ord[400003],ind,v[200003],c,poz[400003];
// ord ord int ->nod
//poz nod ->ord int
void Promote(int nod)
{
    if(nod>1)
    if(v[nod]<v[nod/2])
    {
        swap(v[nod],v[nod/2]);
        ord[poz[nod]]=nod/2;
        ord[poz[nod/2]]=nod;
        swap(poz[nod],poz[nod/2]);
        Promote(nod/2);
    }
}
void Shift(int nod)
{
    int son;
    do
    {
        son=0;
        if(nod*2<=n)son=nod*2;
        if(nod*2+1<=n&&v[nod*2]>v[nod*2+1])son++;

        if(v[son]<v[nod]&&son)
        {
            swap(v[son],v[nod]);
            ord[poz[nod]]=son;
            ord[poz[son]]=nod;
            swap(poz[nod],poz[son]);
            swap(son,nod);
        }
        else son=0;
    }
    while(son);
}
int main()
{
    f>>m;
    for(int i=1;i<=m;++i)
    {
        f>>c;
//        for(int i=1;i<=n;++i)g<<v[i]<<" ";g<<'\n';
//        for(int i=1;i<=n;++i)g<<ord[i]<<" ";g<<'\n';g<<'\n';
        if(c==1)
        {
            n++;ind++;ord[ind]=n;
            poz[n]=ind;
            f>>nr;
            v[n]=nr;
            Promote(n);
        }
        if(c==2)
        {
            f>>nr;
            v[ord[nr]]=v[n];
            n--;
            Shift(ord[nr]);
        }
        if(c==3)
        {
            g<<v[1]<<'\n';
        }
    }
    return 0;
}