Cod sursa(job #2065723)

Utilizator andrei32576Andrei Florea andrei32576 Data 14 noiembrie 2017 08:40:11
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<fstream>
using namespace std;

int n,l,nr,i,x,cod;
int a[200010],H[200010],p[200010];

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

void adauga(int x)
{
    int aux;

    while(x/2 && a[H[x]]<a[H[x/2]])
    {
        aux=H[x];
        H[x]=H[x/2];
        H[x/2]=aux;

        p[H[x]]=x;
        p[H[x/2]]=x/2;
        x/=2;
    }
}

void elimina(int x)
{
    int aux,y=0;

    while(x!=y)
    {
        y=x;

        if(y*2<=l && a[H[x]]>a[H[y*2]]) x=y*2;
        if(y*2+1<=l && a[H[x]]>a[H[y*2+1]]) x=y*2+1;

        aux=H[x];
        H[x]=H[y];
        H[y]=aux;

        p[H[x]]=x;
        p[H[y]]=y;
    }
}

int main()
{

    f>>n;

    for(i=1;i<=n;i++)
    {
        f>>cod;
        if(cod<3)
        {
            f>>x;
        }

        if(cod==1)
        {
            l++;nr++;
            a[nr]=x;
            H[l]=nr;
            p[nr]=l;
            adauga(l);
        }

        if(cod==2)
        {
            a[x]=-1;
            adauga(p[x]);
            p[H[1]]=0;
            H[1]=H[l--];
            p[H[1]] = 1;
            if(l>1) elimina(1);
        }

        if(cod==3) g<<a[H[1]]<<"\n";
    }

    f.close();
    g.close();
    return 0;
}