Cod sursa(job #1537876)

Utilizator SoniaFlorinaHorchidan Sonia-Florina SoniaFlorina Data 28 noiembrie 2015 11:30:23
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("heapuri.in");
ofstream out("heapuri.out");
int n, q=1, x,p;
int e[200000], poz[200000];

typedef int Heap[200000];
Heap H;

int tata(int nod)
{return nod/2;}

int fiu_stg(int nod)
{return nod*2;}

 int fiu_dr(int nod)
{return nod*2+1;}


void Interschimba(int &x, int &y)
{ int aux;
aux=x;
x=y;
y=aux;
}

void coboara(Heap H, int n, int k)
{int fiu;
do
    { fiu=0;
    if(fiu_stg(k)<=n)
        {fiu=fiu_stg(k);
        if(fiu_dr(k)<=n && H[fiu_dr(k)]<H[fiu_stg(k)])
            fiu=fiu_dr(k);
        if(H[fiu]>=H[k])
            fiu=0;}
    if(fiu)
        {Interschimba(H[k],H[fiu]);
        k=fiu;}}
while(fiu);
}


void urca(Heap H, int n, int k)
{
     int m=H[k];
     poz[k]=k;
     int pp=k;
     while (k>1 && m<H[tata(k)])
        {
            H[k]=H[tata(k)];
            Interschimba(poz[pp],poz[tata(k)]);
            k=tata(k);

        }

    H[k]=m;
}


void elimina(Heap H, int &n, int k)
{
    H[k]=H[n];
    n--;
    if (k>1 && H[k]>H[tata(k)])
        urca(H, n, k);
    else
        coboara(H, n, k);
}

int main()
{
    in>>n;
    int i, l=0;
    for(i=0; i<n; i++)
    {
        in>>p;
        if(p==1)
            {
                in>>x;
                poz[q]=q;
                H[q]=x;
                urca(H, q, q);
                q++;
                /*for(int j=1;j<q;j++)
                    cout<<H[j]<<' ';
                cout<<endl;
                for(int j=1;j<q;j++)
                    cout<<j<<' '<<poz[j]<<endl;
                cout<<endl;*/

            }
        else
            if(p==2)
                {
                    in>>x;
                    int nr=q-1;
                    elimina(H,nr,poz[x]);
                }
            else
                if(p==3)
                    out<<H[1]<<'\n';

    }
    in.close();
    out.close();


    return 0;
}