Cod sursa(job #1577145)

Utilizator bullseYeIacob Sergiu bullseYe Data 23 ianuarie 2016 11:44:08
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.61 kb
//problema heapuri infoarena
#include <cstdio>
#define NMAX 200010
using namespace std;

struct pack
{
    int inf;
    int poz;
};

struct pack H[NMAX];
int n;

int inserare (struct pack[], int&, int);//insereaza nodul in heap si returneaza pozitia pe care a fost inserat
void sterge (struct pack[], int&, int);//sterge nodul de pe pozitia data din heap
void combinare(struct pack[], int, int);

int main()
{
    FILE*fin=fopen ("heapuri.in", "r");
    FILE*fout=fopen ("heapuri.out", "w");
    int i, nrop, a, b, j;
    fscanf(fin, "%d", &nrop);
    for (i=1; i<=nrop; ++i)
    {
        fscanf(fin, "%d", &a);
        if (a!=3) fscanf(fin, "%d", &b);
        if (a==1)
        {
            j=inserare(H, n, b);
            H[j].poz=i;
        }
            else
            if (a==2)
            {
                for (j=1; j<=n; ++j)
                    if (H[j].poz==b)
                {
                    sterge(H, n, j);
                    break;
                }
            }
                else
                fprintf(fout, "%d\n", H[1].inf);
    }
    fclose(fout);
    return 0;
}

int inserare(struct pack H[NMAX], int& n, int x)
{
// heap-ul in care inserez, dimensiunea heap-ului, inserez val x
int fiu, tata;
fiu=++n; tata=fiu/2;
// tata=fiu>>1
while (tata && H[tata].inf>x)
    {
        H[fiu]=H[tata];
        fiu=tata;
        tata=fiu/2;
        // tata=fiu>>1
    }
H[fiu].inf=x;
return fiu;
}

void sterge (struct pack H[NMAX], int &n, int tata)//sterge nodul de pe pozitia data din heap
{
    int fiu, x, aux;
    x=H[n].inf; aux=H[n].poz;
    H[tata].inf=x; H[tata].poz=aux;
    --n;

    //vad daca ma duc in sus sau in jos
    if (tata/2 && H[tata].inf<H[tata/2].inf)
    {
        fiu=tata;
        tata/=2;
        x=H[fiu].inf;
        while (tata && H[tata].inf<x)
        {
            H[fiu]=H[tata];
            fiu=tata;
            tata=fiu/2;
        }
        H[fiu].inf=x;
        H[fiu].poz=aux;
    }
        else//o dam pe combinatii
        combinare(H, n, tata);
}

void combinare(struct pack H[NMAX], int n, int i)
// se combina nodul H[i] cu Heapurile cu radacinile 2i si 2i+1, obtinand un nou heap cu radacina H[i]
{
int x=H[i].inf, tata, fiu;
int aux=H[i].poz;
tata=i; fiu=2*i;
while (fiu<=n)
    {
        if (fiu+1<=n && H[fiu+1].inf<H[fiu].inf) fiu++;
        // fiu indica cel mai mic dintre fii
        if (H[fiu].inf<x)
            {
                H[tata]=H[fiu];
                tata=fiu;
                fiu=tata*2;
            }
            else break;
    }
H[tata].inf=x;
H[tata].poz=aux;
}