Cod sursa(job #1578035)

Utilizator dianaorasanuDiana Orasanu dianaorasanu Data 24 ianuarie 2016 09:32:07
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <cstdio>

using namespace std;

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

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

int x, i, cod, n, elem;

struct fr
{
    int inf;
    int nr;
}H[200010];

void inserez(int);
void sterg(int);
void afisez();
void combinare(int i);


int main()
{
    fscanf(fin, "%d", &n);//fin >> n;
    for(i = 1; i <= n; ++i)
    {
        fscanf(fin, "%d", &cod);//fin >> cod;
        if(cod == 1)
        {
            fscanf(fin, "%d", &x);//fin >> x;
            inserez(x);
        }
        else
            if(cod == 2)
        {
            fscanf(fin, "%d", &x);//fin >> x;
            sterg(x);
        }
        else
            afisez();
    }
    return 0;
}


void inserez(int x)
{
    int i;
    int fiu, tata;
    fiu = ++elem;
    tata = fiu/2;
    while(tata > 0 && H[tata].inf > x)
    {
        H[fiu] = H[tata];
        fiu = tata;
        tata = tata/2;
    }

    H[fiu].inf = x;
    H[fiu].nr = elem;
}


void sterg(int x)
{
    int i;
    for(i = 1; i <= elem; ++i)
        if(H[i].nr == x)
            break;
    H[i] = H[elem];
    elem--;
    combinare(i);

}


void afisez()
{
    fprintf(fout, "%d\n", H[1].inf);//fout << H[1].inf << '\n';

}

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