Cod sursa(job #282301)

Utilizator dudu77tTudor Morar dudu77t Data 17 martie 2009 12:32:31
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.49 kb
#include <stdio.h>

int heap[200001], poz[200001], valori[200001], heap_size = 0, k = 0;

void solve();
void push(int);
void move_up(int);
void pop(int);
void move_down(int);
inline void swap(int&, int&);

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

void solve()
{
    int i, n, cod, val, j;
    FILE *fin = fopen ("heapuri.in", "r"), *fout = fopen ("heapuri.out", "w");
    fscanf (fin, "%d", &n);
    for (i = 1; i <= n; ++i)
    {
        fscanf (fin, "%d", &cod);
        if (cod == 1)
        {
            fscanf (fin, "%d", &val);
            push (val);
        }
        else if (cod == 2)
        {
            fscanf (fin, "%d", &val);
            pop(val);
        }
        else
        {
            fprintf (fout, "%d\n", valori[heap[1]]);
        }
/*
        printf ("\n\n codul operatiei: %d", cod);
        if (cod != 3)
        {
            printf (" %d", val);
        }
        printf ("\nheapul:");
        for (j = 1; j <= heap_size; ++j)
        {
            printf (" %d" , heap[j]);
        }
        printf ("\nvalori:");
        for (j = 1; j <= heap_size; ++j)
        {
            printf (" %d" , valori[heap[j]]);
        }
 */
    }
    fclose (fin);
    fclose (fout);
}

void push(int val)
{
    heap[++heap_size] = ++k;
    valori[k] = val;
    poz[k] = heap_size;
    move_up(poz[k]);
}

void move_up(int fiu)
{
    int tata = fiu / 2;
    if (fiu == 1 || valori[heap[fiu]] >= valori[heap[tata]])
    {
        return;
    }
    else
    {
        swap(heap[fiu], heap[tata]);
        swap(poz[heap[tata]], poz[heap[fiu]]);
        move_up(tata);
    }
}

void pop(int index)
{
    index = poz[index];
    heap[index] = heap[heap_size];
    poz[heap[index]] = index;
    --heap_size;
    move_down(index);
    move_up(index);
}

void move_down(int tata)
{
    int fiu;
    if (tata * 2 > heap_size)
    {
        return;
    }
    else if (tata * 2 == heap_size)
    {
        fiu = tata * 2;
    }
    else
    {
        if (valori[heap[tata * 2]] <= valori[heap[tata * 2 + 1]])
        {
            fiu = tata * 2;
        }
        else
        {
            fiu = tata * 2 + 1;
        }
    }
    if (valori[heap[tata]] <= valori[heap[fiu]])
    {
        return;
    }
    else
    {
        swap(heap[tata], heap[fiu]);
        swap(poz[heap[tata]], poz[heap[fiu]]);
        move_down(fiu);
    }
}

inline void swap (int &a, int &b)
{
    int t = a;
    a = b;
    b = t;
}