Cod sursa(job #716822)

Utilizator halianStefanca Stefan halian Data 19 martie 2012 12:06:53
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>
#define FI fopen("heapuri.in","r")
#define FO fopen("heapuri.out","w")

struct Heap {
	long nr;
	long cronoPoz;
} heap[2000002];
long heapSize,crono[200001],cronoLen;

void heapAdd(long nr) {
	Heap aux;
	long i;
	i=heapSize;
	heap[heapSize].nr=nr;
	heap[heapSize].cronoPoz=cronoLen;
	crono[cronoLen]=heapSize;
	cronoLen++;
	heapSize++;
	while(i>1 && heap[i].nr<heap[i/2].nr) {
		aux=heap[i];heap[i]=heap[i/2];heap[i/2]=aux;
		crono[heap[i].cronoPoz]=i;
		i/=2;
		crono[heap[i].cronoPoz]=i;
	}
}

void heapRemove(long cronoPoz) {
	Heap aux;
	long i;
	i=crono[cronoPoz];
	crono[cronoPoz]=0;
	heapSize--;
	heap[i]=heap[heapSize];
	crono[heap[i].cronoPoz]=i;
	while(2*i<heapSize && (heap[i].nr> heap[i*2].nr || heap[i].nr > heap[i*2+1].nr))
		if(2*i+1<heapSize && heap[i*2].nr>heap[i*2+1].nr) {
			aux=heap[i];heap[i]=heap[i*2+1];heap[i*2+1]=aux;
			crono[heap[i].cronoPoz]=i;
			i+=i+1;
			crono[heap[i].cronoPoz]=i;
		}
		else
			if(2*i<heapSize) {
				aux=heap[i];heap[i]=heap[i*2];heap[i*2]=aux;
				crono[heap[i].cronoPoz]=i;
				i+=i;
				crono[heap[i].cronoPoz]=i;
			}
}

long heapFront() {
	return heap[1].nr;
}

int main() {
	long i,n,c,x;
	FILE *fi=FI,*fo=FO;
	fscanf(fi,"%li",&n);
	cronoLen=1;
	heapSize=1;
	for(i=1;i<=n;i++) {
		fscanf(fi,"%li",&c);
		switch(c) {
		case 1: //insereaza x
			fscanf(fi,"%li",&x);
			heapAdd(x);
			break;
		case 2:	//sterge cronologic x
			fscanf(fi,"%li",&x);
			heapRemove(x);
			break;
		case 3:	//minimul
			fprintf(fo,"%li\n",heapFront());
			break;
		}
	}
	return 0;
}