Cod sursa(job #1577119)

Utilizator PescaruVictorPescaru Victor PescaruVictor Data 23 ianuarie 2016 11:33:21
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>

using namespace std;

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

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

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


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

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

int inserare_nod( int val )
{

    int fiu, tata, i;
    fiu=++n;
    tata=fiu/2;
    while (tata>0 && H[tata]>val)
    {
        H[fiu]=H[tata];
        for(i=1; i<n; ++i)
            if(poz[i]==tata) poz[i]=fiu;
        fiu=tata;
        tata=tata/2;
    }
    H[fiu]=val;
    return fiu;
}

int 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];
            for(i=1; i<n; ++i)
                if(poz[i]==tata) poz[i]=fiu;
            tata=fiu;
            fiu=2*tata;
        }
        else break;
    }
    H[tata]=inf;
    return tata;
}