Cod sursa(job #2295656)

Utilizator cc4infinityCojocaru Catalin cc4infinity Data 3 decembrie 2018 20:34:48
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int i,j,c,n,m,poz,q[200005],p[200005],v[200005],x,y;
//SuS e MINIMM (MIN HEAP) parca

void sus(int nod)
{
    while (nod>1 && v[p[nod]]<v[p[nod/2]])
    {
        swap(q[nod],q[nod/2]);
        swap(p[q[nod]],p[q[nod/2]]);
        nod/=2;
    }
   // p[poz]=nod;
}

void jos(int nod)
{
    int son=nod*2;
    if (son<=n)
    {
        if (son+1<=n)
        {
            if (v[q[nod]]>v[q[son]] || v[q[nod]]>v[q[son+1]])
            if (v[q[son]]<v[q[son+1]])
            {
                swap(q[nod],q[son]);
                swap(p[q[nod]],p[q[son]]);
                jos(son);
            }
            else
            {
                swap(q[nod],q[son+1]);
                swap(p[q[nod]],p[q[son+1]]);
                jos(son+1);
            }
        }
        else
        if (v[q[nod]]>v[q[son]])
        {
            swap(q[nod],q[son]);
            swap(p[q[nod]],p[q[son]]);
            jos(son);
        }

    }
}

void scot(int nod)
{
    q[nod]=q[n];
    p[nod]=q[n];
    n--;
    if (nod>1 && v[q[nod]]<v[q[nod/2]])
        sus(nod);
      else jos(nod);
}

int main()
{
    fin>>m;
    for (i=1;i<=m;i++)
    {
        fin>>c;
        if (c==1)
        {
            fin>>v[poz+1];
            n++;
            poz++;
            q[n]=poz;
            p[poz]=n;
            sus(n);
        } else
        if (c==2)
        {
            fin>>x;
            scot(p[x]);
        }  else
        if (c==3)
            fout<<v[q[1]]<<"\n";
    }
    return 0;
}