Cod sursa(job #2269628)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 26 octombrie 2018 11:58:36
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>

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



struct heap
{
    int val,poz;
}h[200100];

int n,fv[200100];


void up(int p)
{
    if(p>=1 && h[p].val<h[p/2].val)
    {
        swap(h[p],h[p/2]);
        fv[h[p].poz]=p;
        fv[h[p/2].poz]=p/2;
        up(p/2);
    }
}


void down(int p)
{
    if(2*p+1<=n && (h[2*p].val<h[p].val || h[2*p+1].val<h[p].val))
    {
        if(h[2*p].val < h[2*p+1].val){swap(h[p],h[2*p]);fv[h[p].poz]=p;fv[h[2*p].poz]=2*p;down(2*p);}
         else {swap(h[p],h[2*p+1]);fv[h[p].poz]=p;fv[h[2*p+1].poz]=2*p+1;down(2*p+1);}
    }

    else if(2*p<=n && h[2*p].val<h[p].val)
    {
        swap(h[p],h[2*p]);fv[h[p].poz]=p;fv[h[2*p].poz]=2*p;down(2*p);
    }

}

int m,i,cerinta,x,pozitie;

int main()
{
    f>>m;
    for(i=1;i<=m;i++)
    {
        f>>cerinta;

        if(cerinta==1)
        {
            f>>x;
            n++;
            h[n].val=x;
            h[n].poz=n;
            fv[h[n].poz]=n;
            up(n);
        }

        else if(cerinta==2)
        {
            f>>pozitie;
            h[fv[pozitie]].val=INT_MAX;

            down(fv[pozitie]);

        }

        else g<<h[1].val<<'\n';
    }
    return 0;
}