Cod sursa(job #2071064)

Utilizator andrei32576Andrei Florea andrei32576 Data 20 noiembrie 2017 10:29:19
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>
using namespace std;

int n,i,op,x,k,nr,a[200010],H[200010],p[200010];

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

void swap(int i,int j)
{
    int aux=H[i];
    H[i]=H[j];H[j]=aux;
    p[H[i]]=i;
    p[H[j]]=j;
}

void up(int k)
{
    int tata=k/2,fiu=k;
    while(tata && a[H[tata]]>a[H[fiu]])
    {
        swap(fiu,tata);
        fiu=tata;
        tata=tata/2;
    }
}

void down(int p)
{
    int tata=p,fiu=2*p;
    while(fiu<=k)
    {
        if(fiu+1<=k && a[H[fiu]]>a[H[fiu+1]]) fiu++;
        if(a[H[tata]]>a[H[fiu]])
        {
            swap(fiu,tata);
            tata=fiu;
            fiu=2*tata;
        }
        else fiu=k+1;
    }
}

int main()
{
    f>>n;
    for(i=1;i<=n;i++)
    {
        f>>op;
        if(op==1 || op==2)
            f>>x;

        if(op==1)
        {
            k++;nr++;
            a[nr]=x;
            H[k]=nr;
            p[nr]=k;
            up(k);
        }
        else if(op==2)
        {
            a[x]=-1;
            up(p[x]);
            p[H[1]]=0;
            H[1]=H[k];
            k--;
            p[H[1]]=1;
            if(k>1) down(1);
        }
        else g<<a[H[1]]<<"\n";

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