Cod sursa(job #969882)

Utilizator Mihaela.GamanMihaela Petruta Gaman Mihaela.Gaman Data 5 iulie 2013 16:29:03
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include<stdio.h>
#include<stdlib.h>

struct Node {
		int value;
		int ord;
	};

class MinHeap{
	public:
		struct Node *H;
		int Dcurr, Dmax;

		MinHeap(int maxDim){
			this->Dmax = maxDim;
			H = new Node[this->Dmax + 1];
			Dcurr = 0;
		}

		void Insert(struct Node x){
			Dcurr++;
			H[Dcurr] = x;
			pushUp(Dcurr);
		} 

		int retMin(){
			return H[1].value;
		}

		void extractOrd(int poz){
			int i;
			for(i=1; i<=Dcurr; i++){
				if(H[i].ord == poz)
					break;
			}

			H[i] = H[Dcurr];
			Dcurr--;
			pushUp(Dcurr);
			heapify(Dcurr);
		}

		void pushUp(int l){
			int parent;
			Node aux;

			parent = l/2;

			while(l > 1 && H[parent].value > H[l].value){
					aux = H[parent];
					H[parent] = H[l];
					H[l] = aux;
	
					l = parent;
					parent = l/2;
			}
		}

		void heapify(int l){
			int left, right, m;
			struct Node aux;
			
			left = 2*l;
			right = left + 1;

			if((left <= Dcurr && H[left].value < H[l].value) && H[left].value < H[right].value)
				m = left;
			else
				m = l;

			if((right <= Dcurr && H[right].value < H[l].value) && H[right].value < H[left].value)
				m = right;
			if(m != l){
				aux = H[m];
				H[m] = H[l];
				H[l] = aux;

				heapify(m);
			}
		}

		void print(){
			int i;
			for(i=1; i<=Dcurr; i++)
				printf("%d ", H[i].value);
			printf("\n");
		}
};

int main(){
	int info, ent, code, N, i, ord = 0, min;
	struct Node x;
	class MinHeap hp(1000000);
	FILE *pf, *pg;

	pf = fopen("heapuri.in", "r");
	pg = fopen("heapuri.out", "w");

	fscanf(pf, "%d", &N);
	
	for(i=1; i<=N; i++){
		fscanf(pf, "%d", &code);

		if(code == 1){
			fscanf(pf, "%d", &info);
			ord++;
			x.value = info;
			x.ord = ord;
			hp.Insert(x);
			hp.print();
		}

		else
			if(code == 2){
				fscanf(pf, "%d", &ent);
				hp.extractOrd(ent);
				hp.print();
			}

			else
				if(code == 3){
					min = hp.retMin();
					fprintf(pg, "%d\n", min);
				}
	}

	fclose(pf);
	fclose(pg);

	return 0;
}