Cod sursa(job #1576988)

Utilizator bullseYeIacob Sergiu bullseYe Data 23 ianuarie 2016 09:46:35
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
//problema heapuri infoarena
#include <cstdio>
#define NMAX 200010
using namespace std;

int n, H[NMAX];
int timeline[NMAX];//timeline[i]=pozitia pe care se afla al i-lea nod inserat in ordine cronologica

int inserare (int[], int&, int);//insereaza nodul in heap
void sterge (int[], int&, int);//sterge nodul de pe pozitia data din heap


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

int inserare (int H[NMAX], int &n, int x)//functia returneaza pozitia pe care am introdus nodul x
{
    //il pun mai intai la sfarsit
    int tata, fiu;
    fiu=++n; tata=fiu/2;
    while (tata && H[tata]>x)
    {
        H[fiu]=H[tata];
        fiu=tata;
        tata/=2;
    }
    //la sfarsit, introduc nodul x pe pozitia tata
    H[fiu]=x;
    return fiu;
}

void sterge (int H[NMAX], int &n, int tata)
{
    //ma duc in jos pana scap de nodul de pe pozitia poz
    int fiu, i;
    fiu=2*tata;
    while(tata)
    {
        if (H[fiu+1] && H[fiu+1]<H[fiu]) ++fiu;
        H[tata]=H[fiu];
        tata=fiu;
        fiu=tata*2;
    }
    tata/=4;//daca am sters nodul din stanga si nodul are si fiu in dreapta, mut nodul din dreapta in stanga
    if (H[tata*2]==0 && H[tata*2+1]!=0)
    {
        H[tata*2]=H[tata*2+1];
        H[tata*2+1]=0;
    }
    return;
}