Cod sursa(job #2071059)

Utilizator andrei32576Andrei Florea andrei32576 Data 20 noiembrie 2017 10:17:28
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 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 x)
{
    int y=0;

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

        if(y*2<=k && a[H[x]]>a[H[y*2]]) x=y*2;
        if(y*2+1<=k && a[H[x]]>a[H[y*2+1]]) x=y*2+1;
        swap(x,y);
    }
}

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;
}