Cod sursa(job #428181)

Utilizator nandoLicker Nandor nando Data 28 martie 2010 22:51:49
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>

#define MAX 200000
#define left_son(a) (a<<1)
#define right_son(a) ((a<<1)+1)
#define father(a) (a>>1)

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

inline  void swap(int a,int b){
    int c=heap[a];
    heap[a]=heap[b];
    heap[b]=c;

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

void upHeap(int x){
	while(x/2&&val[heap[x]]<val[heap[father(x)]]){
		swap(x,father(x));
		x=father(x);
	}
}

void downHeap(int x){
	int y=0,w;
	while(x!=y){
		y=x;
		if(left_son(y)<=l&&val[heap[x]]>val[heap[left_son(y)]]){
			x=left_son(y);
		}
		if(right_son(y)<=l&&val[heap[x]]>val[heap[right_son(y)]]){
			x=right_son(y);
		}
		swap(x,y);
	}
}

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

int main(){
	int numOp,op,x;
	fscanf(fin,"%d ",&numOp);
	for(int i=0;i<numOp;i++){
		fscanf(fin,"%d ",&op);
		switch(op){
			case 1:
				fscanf(fin,"%d ",&x);

				l++,n++;
				val[n]=x;
				heap[l]=n;
				pos[n]=l;
				upHeap(l);

				break;
			case 2:
				fscanf(fin,"%d ",&x);

				val[x]=-1;
				upHeap(pos[x]);
				
				pos[heap[1]]=0;
				heap[1]=heap[l--];
				pos[heap[1]]=1;
				if(l>1){
					downHeap(1);
				}

				break;
			case 3:
				fprintf(fout,"%d\n",val[heap[1]]);
				break;
		}
	}
	fclose(fin);
	fclose(fout);
	return 0;
}