Cod sursa(job #1502243)

Utilizator experiment322Alexandru-Damian Manea experiment322 Data 14 octombrie 2015 13:57:38
Problema Heapuri Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.83 kb
#include <stdio.h>

struct heap {
	int tree[200000];
	int end;
} heap;

int insertorder[200000];
const int heaproot = 0;
int insertno = -1;

void initheap(void)
{
	int i;
	for (i = 0; i < 200000; ++i) {
		heap.tree[i] = -1;
	}
	heap.end = -1;
}

void heap_add(int newitem)
{
	int itempos = ++heap.end;
	insertorder[++insertno] = heap.end;
	heap.tree[itempos] = newitem;
	int parent = (itempos - 1) / 2;
	int aux;
	while (itempos != heaproot) {
		if (heap.tree[itempos] < heap.tree[parent]) {
			aux = heap.tree[itempos];
			heap.tree[itempos] = heap.tree[parent];
			heap.tree[parent] = aux;
		} else {
			break;
		}
		itempos = parent;
		parent = (itempos - 1) / 2;
	}
}

void heap_del(int insitmno)
{
	int itempos = insertorder[insitmno];
	heap.tree[itempos] = heap.tree[heap.end--];
	int i, parentno, left, right, aux;
	parentno = (i + 1) / 2;
	for (i = 0; i < parentno; ++i) {
		left = 2 * i + 1;
		right = left + 1;
		if (heap.tree[left] < heap.tree[right]) {
            if (heap.tree[i] > heap.tree[left]) {
                aux = heap.tree[i];
                heap.tree[i] = heap.tree[left];
                heap.tree[left] = aux;
            }
		} else if (heap.tree[i] > heap.tree[right]) {
		    aux = heap.tree[i];
		    heap.tree[i] = heap.tree[right];
		    heap.tree[right] = aux;
		}
	}
}

int main(void)
{
	initheap();
	int N;
	FILE *in = fopen("heapuri.in", "r");
	FILE *out = fopen("heapuri.out", "w");
	fscanf(in, "%d", &N);
	int i, op, aux;
	for (i = 0; i < N; ++i) {
		fscanf(in, "%d", &op);
		switch (op) {
			case 1:
				fscanf(in, "%d", &aux);
				heap_add(aux);
				break;
			case 2:
				fscanf(in, "%d", &aux);
				heap_del(aux);
				break;
			case 3:
				fprintf(out, "%d\n", heap.tree[0]);
				break;
		}
	}
	fclose(in);
	fclose(out);
    return 0;
}