Cod sursa(job #1502378)

Utilizator experiment322Alexandru-Damian Manea experiment322 Data 14 octombrie 2015 16:40:40
Problema Heapuri Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.66 kb
#include <stdio.h>

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

int insertorder[200000];
int insertno = -1;

void initheap(void)
{
	int i;
	for (i = 0; i < 200000; ++i) {
		heap.tree[i] = 0x7fffffff;
	}
	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 = 1;
	while (aux) {
		aux = 0;
		if (heap.tree[itempos] < heap.tree[parent]) {
			aux = heap.tree[itempos];
			heap.tree[itempos] = heap.tree[parent];
			heap.tree[parent] = aux;
			itempos = parent;
			parent = (itempos - 1) / 2;
			aux = 1;
		}
	}
}

void heap_del(int insitmno)
{
	int itempos = insertorder[insitmno];
	heap.tree[itempos] = heap.tree[heap.end--];
	int left, right, aux, smallest = 1;
	while (smallest) {
		left = 2 * itempos + 1;
		right = left + 1;
		if (heap.tree[left] < heap.tree[right]) {
			smallest = left;
		} else {
			smallest = right;
		}
		if (heap.tree[smallest] < heap.tree[itempos] && smallest <= heap.end) {
			aux = heap.tree[itempos];
			heap.tree[itempos] = heap.tree[smallest];
			heap.tree[smallest] = aux;
			itempos = smallest;
			smallest = 1;
		} else {
			smallest = 0;
		}
	}
}

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 + 1);
				break;
			case 3:
				fprintf(out, "%d\n", heap.tree[0]);
				break;
		}
	}
	fclose(in);
	fclose(out);
	return 0;
}