Cod sursa(job #970369)

Utilizator Mihaela.GamanMihaela Petruta Gaman Mihaela.Gaman Data 6 iulie 2013 18:07:45
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.42 kb
#include<stdio.h>
#include<stdlib.h>

struct Node {
		int value;
		int ord;
	};

class MinHeap{
	public:
		struct Node *H;
		int Dcurr, Dmax;
		int *poz, nro;			
//vector in care retin la indicele i(corespunzator ordinii citirii elementului din fisier) pozitia pe care o ocupa in H

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

		void Insert(int x){
			struct Node elem;			

			Dcurr++;
			nro++;
			elem.value = x;
			elem.ord = nro;
			H[Dcurr] = elem;
			poz[nro] = Dcurr;
			pushUp(Dcurr);
		} 

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

		void extractOrd(int entr){
			
			int paux;
			H[poz[entr]] = H[Dcurr];
			paux = poz[entr];
			poz[entr] = poz[H[Dcurr].ord];
			poz[H[Dcurr].ord] = paux;
			
			poz[entr] = 0;
			Dcurr--;
			pushUp(paux);
			heapify(paux);
		}

		void pushUp(int l){
			int parent;
			int paux;
			struct Node vaux;

			parent = l/2;

			while(l > 1 && H[parent].value > H[l].value){
					paux = poz[H[parent].ord];
					poz[H[parent].ord] = poz[H[l].ord];
					poz[H[l].ord] = paux;

					vaux = H[parent];
					H[parent] = H[l];
					H[l] = vaux;

					l = parent;
					parent = l/2;
			}
		}

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

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

				if((right <= Dcurr && H[right].value < H[l].value) && H[right].value < H[left].value)
					m = right;
				else
					m = l;
			if(m != l){
				paux = poz[H[l].ord];
				poz[H[l].ord] = poz[H[m].ord];
				poz[H[m].ord] = paux;

				vaux = H[l];
				H[l] = H[m];
				H[m] = vaux;

				heapify(m);
			}
		}

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

			for(i=1; i<=nro; i++)
				printf("%d ", poz[i]);
			printf("\n");
		}

};

int main(){
	int info, ent, code, N, i, ord = 0, min;
	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);
			
			hp.Insert(info);
		}

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

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

	fclose(pf);
	fclose(pg);

	return 0;
}