Cod sursa(job #1577168)

Utilizator stefan1Medvichi Stefan stefan1 Data 23 ianuarie 2016 11:57:38
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <cstdio>
#define DMAX 200002

using namespace std;
FILE * fin=fopen("heapuri.in", "r");
FILE * fout=fopen("heapuri.out", "w");

struct heap
{
int inf;
int nr;
};

heap H[DMAX];
int poz[DMAX];
int n, nrop, minm, nrp;

void citire();
void inserare(int inf, int nrp);
void combinare(int i);
int extragere_min();

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

void citire()
{
int i, cod, x, pz;
fscanf(fin, "%d", &nrop);
for (i=0; i<nrop; ++i)
    {
        fscanf(fin, "%d", &cod);
        if (cod==1) // inserare
            {
                fscanf(fin, "%d", &x);
                nrp++;
                inserare(x, nrp);
            }
        else if (cod==2) // sterge
            {
                fscanf(fin, "%d", &x);
                pz=poz[x];
                H[pz]=H[n--];
                combinare(pz);
            }
        else // minimul
            fprintf(fout, "%d\n", extragere_min());
    }
}

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

void combinare(int i)
{
int inf = H[i].inf, tata, fiu;
int timp = H[i].nr;
tata=i; fiu=2*i;
while (fiu<=n)
    {
        if (fiu+1<=n && H[fiu].inf>H[fiu+1].inf) fiu++;
        if (H[fiu].inf<inf)
            {
                H[tata]=H[fiu];
                poz[H[fiu].nr]=tata;
                tata=fiu;
                fiu=2*tata;
            }
            else
            break;
    }
H[tata].inf=inf;
H[tata].nr=timp;
poz[timp]=tata;
}

int extragere_min()
{
return H[1].inf;
}