Cod sursa(job #1582526)

Utilizator PescaruVictorPescaru Victor PescaruVictor Data 27 ianuarie 2016 23:59:49
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>

using namespace std;

ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");

int poz[200009], H[200009], cat[200009];
int n;

void citire ();
void inserare_nod (int val);
void combinare (int i);


int main()
{
    citire();
    return 0;
}

void citire ()
{
    int i, op, ord, nr, x ;
    fin>>nr;
    for(i=1; i<=nr; ++i)
    {
        fin>>op;
        if(op==1)
        {
            fin>>x;
            inserare_nod(x);
        }
        else if (op==2)
        {
            fin>>ord;
            H[poz[ord]]=H[n--];
            combinare(poz[ord]);
        }
        else fout<<H[1]<<'\n';
    }
}

void inserare_nod( int val )
{

    int fiu, tata;
    fiu=++n;
    tata=fiu/2;
    while (tata>0 && H[tata]>val)
    {
        H[fiu]=H[tata];
        poz[cat[tata]]=fiu;
        cat[fiu]=cat[tata];
        fiu=tata;
        tata=tata/2;
    }
    H[fiu]=val;
    poz[n]=fiu;
    cat[fiu]=n;
}

void combinare (int i)
{
    int inf=H[i], tata=i, fiu=2*i;

    while(fiu<=n)
    {
        if(fiu+1<=n && H[fiu]>H[fiu+1]) ++fiu;
        if(H[fiu]<inf)
        {
            H[tata]=H[fiu];
            cat[fiu]=cat[tata];
            poz[cat[fiu]]=fiu;
            tata=fiu;
            fiu=2*tata;
        }
        else break;
    }
    H[tata]=inf;
    poz[cat[tata]]=tata;
    cat[tata]=n+1;
}