Cod sursa(job #2068234)

Utilizator andrei32576Andrei Florea andrei32576 Data 17 noiembrie 2017 14:03:22
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<fstream>
using namespace std;

int n,l,nr,i,j,x,op,p;
struct heap{int v,p;};
heap H[200002];

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

void up(int k,int n)
{
    int tata=k/2,fiu=k;
    while(tata && H[fiu].v<H[tata].v)
    {
        swap(H[fiu],H[tata]);
        fiu=tata;
        tata=tata/2;
    }
}

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

void elimin(int k,int &n)
{
    H[k]=H[n];
    n--;
    if(k>1 && H[k].v<H[k/2].v) up(k,n);
    else down(k,n);
}

int main()
{

    f>>n;
    nr=0;
    l=0;
    for(i=1;i<=n;i++)
    {
        f>>op;
        if(op==1 || op==2)
        {
            f>>x;
        }

        if(op==1)
        {
            l++;nr++;
            H[l].v=x;
            H[l].p=nr;
            up(l,l);
        }

        if(op==2)
        {
            p=0;
            for(j=1;j<=l;j++)
                if(H[j].p==x) p=j;
            elimin(p,l);
        }

        if(op==3) g<<H[1].v<<"\n";
    }

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