Cod sursa(job #1538168)

Utilizator SoniaFlorinaHorchidan Sonia-Florina SoniaFlorina Data 28 noiembrie 2015 16:39:21
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("heapuri.in");
ofstream out("heapuri.out");
int n, q=0, x, lh=0;
int poz_heap[200001],poz_vec[200001];

typedef int Heap[200001];
Heap H;

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

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

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


void Interschimba(int a, int b)
{
    int s=poz_vec[a];
    int t=poz_vec[b];
    int aux;
    aux=H[b];
    H[a]=H[b];
    H[a]=aux;
    poz_vec[b] = s;
    poz_heap[s] = b;
    poz_vec[a] = t;
    poz_heap[t] = a;
}

void coboara(int k)
{
    int fiu, ok=1;
    while(fiu_stg(k)<=lh && ok)
    {
        fiu=fiu_stg(k);
        if(fiu_dr(k)<=lh && fiu_dr(k)<fiu_stg(k))
            fiu=fiu_dr(k);
        if(H[k]>H[fiu])
        {
            Interschimba(k,fiu);
            k=fiu;
        }
        else
            ok=0;
    }
}


void urca(int k)
{
     while (k>1 && H[k]<H[tata(k)])
        {
            Interschimba(k,tata(k));
            k=tata(k);
        }
}


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


void insereaza(int e)
{
    lh++;
    H[lh]=e;
    poz_heap[q]=lh;
    poz_vec[lh]=q;
    urca(e);
}

int main()
{
    in>>n;
    int i, l=0,cerinta;
    for(i=0; i<n; i++)
    {
        in>>cerinta;
        if(cerinta==1)
            {
                in>>x;
                q++;
                insereaza(x);

            }
        else
            if(cerinta==2)
                {
                    in>>x;
                    elimina(H,poz_heap[x]);
                }
            else
                if(cerinta==3)
                    out<<H[1]<<'\n';

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


    return 0;
}