Cod sursa(job #428155)

Utilizator nandoLicker Nandor nando Data 28 martie 2010 22:05:25
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>


#define MAX 200000

int val[MAX],pos[MAX],heap[MAX],n,l;

void swapH(int a,int b){
	int aux=heap[a];
	heap[a]=heap[b];
	heap[b]=aux;

	pos[heap[a]]=a;
	pos[heap[b]]=b;
}

void upHeap(int k){
	while(k>>1&&val[heap[k>>1]]>val[heap[k]]){
		swapH(k,k>>1);
		k>>=1;
	}
}	

void downHeap(int p){
	int q=0,w;
	while(q!=p){
		q=p;
		w=p<<1;    if(w<=n&&val[heap[w]]<val[heap[p]]) p=w;
		w=(p<<1)+1;if(w<=n&&val[heap[w]]<val[heap[p]]) p=w;
		swapH(q,p);
	}
}

void insert(int k){
	++n,++l;
	val[l]=k;
	heap[n]=l;
	pos[l]=n;
	upHeap(n);
}

void remove(int k){
	val[k]=-1;
	upHeap(pos[k]);
	
	pos[heap[1]]=0;
	heap[1]=heap[n--];
	pos[heap[1]]=1;
	
	downHeap(1);
}

FILE* fin=fopen("heapuri.in","r");
FILE* fout=fopen("heapuri.out","w");

int main(){
	int numOp,op,m;
	fscanf(fin,"%d ",&numOp);
	while(numOp--){
		fscanf(fin,"%d ",&op);
		switch(op){
			case 1:
				fscanf(fin,"%d ",&m);
				insert(m);
				break;
			case 2:
				fscanf(fin,"%d ",&m);
				remove(m);
				break;
			case 3:
				fprintf(fout,"%d\n",val[heap[1]]);
				break;
		}
	}
	fclose(fin);
	fclose(fout);
	return 0;
}