Cod sursa(job #2186219)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 25 martie 2018 13:59:05
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 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[2*p],h[p]);fv[h[p].poz]=p;fv[h[2*p].poz]=2*p;}

}

int m,V,poz,x,i;
int main()
{
    f>>m;
    n=0;
    for(i=1;i<=m;i++)
    {

    f>>x;
    if(x==1)
    {
        f>>V;
        n++;
        h[n].val=V;
        h[n].poz=n;
        fv[h[n].poz]=n;
        up(n);
    }
    else if(x==2)
    {
        f>>poz;
        h[fv[poz]].val=INT_MAX;
        down(fv[poz]);
    }

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

    }
    return 0;
}