Cod sursa(job #1577162)

Utilizator Lucian_BosinceanuLucian-Andrei Bosinceanu Lucian_Bosinceanu Data 23 ianuarie 2016 11:54:15
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#define DMAX 200005

using namespace std;

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

struct elem
{
int inf;
int nr;
};

int n,nrop,ord;
elem H[DMAX];
int poz[DMAX];

void inserare(int val);
void combinare(int i); //i=pozitia nodului radacina
void afisare_min();

int main()
{
int i,tipop,x;
fin>>nrop;
for (i=1;i<=nrop;++i)
    {
     fin>>tipop;
     if (tipop==3) afisare_min();
        else
        {
         fin>>x;
         if (tipop==1)
            {
            ++ord;
            inserare(x);
            }
             else
             {
              H[poz[x]]=H[n--];
              combinare(poz[x]);
             }
        }
    }
    return 0;
}

void inserare(int val)
{
int fiu,tata;
fiu=++n;
tata=fiu/2;
while(tata>0 && H[tata].inf>val)
     {
      H[fiu]=H[tata];
      poz[H[tata].nr]=fiu;
      fiu=tata;
      tata=tata/2;
     }
H[fiu].inf=val;
H[fiu].nr=ord;
poz[ord]=fiu;
}

//https://mail.google.com/mail/u/0/#inbox

void combinare(int i)
{
int val=H[i].inf,tata=i,fiu=2*i;
while (fiu<=n) //cat timp mai exista fii
    {
    if (fiu+1<=n && H[fiu].inf>H[fiu+1].inf) fiu++;
    //fiu indica cel mai mic dintre fii
    if (H[fiu].inf<val)
        {//promovez pe cel mai mic dintre fii
        H[tata]=H[fiu];
        poz[H[fiu].nr]=tata;
        tata=fiu;
        fiu=2*tata;
        }
        else break; //am gasit locul! Ies!
    }
H[tata].inf=val;
H[tata].nr=ord;
poz[ord]=tata;
}


void afisare_min()
{
fout<<H[1].inf<<'\n';
}