Cod sursa(job #2153926)

Utilizator StepHoria Stefan Step Data 6 martie 2018 16:16:57
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int N=200001;
int h[N],nh,v[N],poz[N];

void swapp( int p, int q)
{
    swap( h[p] , h[q] );
    poz[ h[p] ]=p;
    poz[ h[q] ]=q;
}

void urca (int p)
{
    while ( p>1 && v[ h[p] ] < v[ h[p/2] ] )
    {
        swapp( p , p/2 );
        p/=2;
    }
}

void coboara (int p)
{
    int fs=2*p,fd=2*p+1,bun=p;

    if (fs<=nh && v[ h[fs] ] < v[ h[bun] ])
        bun=fs;

    if (fd<=nh && v[ h[fd] ] < v[ h[bun] ])
        bun = fd;
    if (bun != p)
    {
        swapp ( p , bun );
        coboara (bun);
    }
}

void adauga (int val)
{
    h[++nh]=val;
    poz[val]=nh;
    urca(nh);
}

void sterge (int p)
{
    swapp ( p , nh-- );
    urca(p);
    coboara (p);
}
int main()
{
    int n,i,x,o,nr=0;
    f>>n;
    for (i=1; i<=n; i++)
    {
        f>>o;
        if (o==1)
        {
            f>>v[++nr];
            adauga(nr);
        }
        if (o==2)
        {
            f>>x;
            sterge( poz[x] );
        }
        if (o==3)
        {
            g<<v[h[1]]<<"\n";
        }

    }
    return 0;
}