Cod sursa(job #766681)

Utilizator igsifvevc avb igsi Data 11 iulie 2012 20:50:52
Problema Heapuri Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.01 kb
#include<stdio.h>

int heap[200001], heapSize, v[200001], nr, position[200001];

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

        position[ heap[root] ] = root;
        position[ heap[pos] ] = pos;

        pos >>= 1;
        root >>= 1;
    }
}

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

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

		if(pos != next)
		{
        	heap[pos] += heap[next];
        	heap[next] = heap[pos] - heap[next];
        	heap[pos] -= heap[next];
			
        	position[ heap[pos] ] = pos;
        	position[ heap[next] ] = next;
        }
    } while(pos != next);
}

int main()
{
    FILE *in, *out;
    int op, value, order, N;
    int i, j, k;

    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:/* insert */
                fscanf(in, "%d", &value);
                v[++nr] = value;
                position[nr] = ++heapSize;
                heap[heapSize] = nr;

                up(heapSize);
                break;
            case 2:/* delete */
                fscanf(in, "%d", &order);
                heap[ position[order] ] = heap[heapSize];
                position[ heap[heapSize--] ] = position[order];
                
                down( position[order] );                
                up( position[order] );
                break;
            case 3:/* print minimum */
                fprintf(out, "%d\n", v[ heap[1] ]);
                break;
            default:
                fprintf(stderr, "input error!\n");
        }
    }
    
    fclose(in);
    fclose(out);
    return 0;
}