Cod sursa(job #358131)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 21 octombrie 2009 22:19:17
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <stdio.h>

int M;
int heap[10024], N;

void insereaza(int x)
{
    heap[++N] =  x;
    int nod, aux;
    for (nod = N; nod > 1; nod /= 2)
        if (heap[nod] < heap[nod/2])
            aux = heap[nod],
            heap[nod] = heap[nod/2],
            heap[nod/2] = aux;
}

void stergere(int nod)
{
    // aducem ultimul din heap pe pozitia nodului nod
    heap[nod] = heap[N];
    --N;

    // facem coborarea nodului nod
    for (; nod * 2 <= N; )
    {
        // vedem care din cei maxim 2 fii este mai mic
        int val = heap[2 * nod], imin = 2 * nod;
        if (nod * 2 + 1 <= N && heap[2 * nod + 1] < heap[2 * nod])
            val = heap[2 * nod + 1], imin = 2 * nod + 1;

        if (heap[nod] <= heap[imin])
            return ;

        int aux = heap[nod];
        heap[nod] = heap[imin];
        heap[imin] = aux;
        nod = imin;
    }
}

int main()
{
    int i, tip, x, nod;
    
    freopen("heap.in", "r", stdin);

    scanf("%d", &M);
    for (i = 1; i <= M; ++i)
    {
        scanf("%d", &tip);
        if (tip == 1) // inserare a unei valori
        {
            scanf("%d", &x);
            insereaza(x);
        }
        else if (tip == 2) // stergere a unui nod de indice dat
        {
            scanf("%d", &nod);
            stergere(nod);
        }
        else if (tip == 3) // interogare minim
            printf("%d\n", heap[1]);
    }
    

    return 0;
}