Cod sursa(job #766646)

Utilizator igsifvevc avb igsi Data 11 iulie 2012 19:16:35
Problema Heapuri Scor 30
Compilator c Status done
Runda Arhiva educationala Marime 1.96 kb
#include<stdio.h>

int heap[200001], position[200001], order[200001], heapSize;
FILE *in, *out;

void up(int pos);
void down(int pos);

int main()
{
    int n, op, value, pos;
    in = fopen("heapuri.in", "r");
    out = fopen("heapuri.out", "w");

    for(fscanf(in, "%d", &n); n; --n)
    {
        fscanf(in, "%d", &op);
        switch(op)
        {
            case 1:
                fscanf(in, "%d", &value);
                order[ ++order[0] ] = value;
                position[ value ] = ++heapSize;
                heap[ heapSize ] = value;
                up( heapSize );
                break;
            case 2:
                fscanf(in, "%d", &value);
                pos = position[ order[ value ] ];
                heap[pos] = heap[heapSize--];
                position[ heap[pos] ] = pos;

                if(pos > 1 && heap[pos] < heap[pos >> 1])
                    up(pos);
                else if(pos < heapSize)
                    down(pos);

                break;
            case 3:
                fprintf(out, "%d\n", heap[1]);
                break;
            default:
                fprintf(stderr, "input error\n");
        }
    }

    fclose(in);
    fclose(out);
    return 0;
}

void down(int pos)
{
    int next = pos;

    if((pos << 1) <= heapSize && heap[next] > heap[pos << 1])
        next = pos << 1;

    if((pos << 1) + 1 <= heapSize && heap[next] > heap[(pos << 1) + 1])
        next = (pos << 1) + 1;
    
    if(next != pos) 
    {
        heap[pos] += heap[next];
        heap[next] = heap[pos] - heap[next];
        heap[pos] -= heap[next];

        position[heap[pos]] = pos;
        position[heap[next]] = next;

        down(next); 
    }
}

void up(int pos)
{
    if(pos > 1 && heap[pos >> 1] > heap[pos])
    {
        heap[pos] += heap[pos >> 1];
        heap[pos >> 1] = heap[pos] - heap[pos >> 1];
        heap[pos] -= heap[pos >> 1];

        position[heap[pos]] = pos;
        position[heap[pos >> 1]] = pos >> 1;

        up(pos >> 1);
    }
}