Cod sursa(job #771661)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 26 iulie 2012 19:34:08
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<stdio.h>
#define dim 200010

FILE*f=fopen("heapuri.in","r");
FILE*g=fopen("heapuri.out","w");

int aux;
int V[dim],P[dim],H[dim],n,dh,k,x,op,i;

void up(int y){
	int c=y;
	int p=y/2;
	while(p!=0){
		if(V[H[p]]>V[H[c]]){
			aux=H[p];
			H[p]=H[c];
			H[c]=aux;
			P[H[p]]=p;
			P[H[c]]=c;
			c=p;
			p/=2;
		}
		else
			break;
	}
}

void down(int y){
	int p=y;
	int c=p*2;
	while(c<=dh){
		if(c<dh&&V[H[c]]>V[H[c+1]])
			c++;
		if(V[H[p]]>V[H[c]]){
			aux=H[p];
			H[p]=H[c];
			H[c]=aux;
			P[H[c]]=c;
			P[H[p]]=p;
			p=c;
			c=2*p;
		}
		else
			break;
	}
	
}

int main(){
	fscanf(f,"%d",&n);
	for(i=1;i<=n;i++){
		fscanf(f,"%d",&op);
		switch(op){
		case 1:
			fscanf(f,"%d",&V[++k]);
			H[++dh]=k;
			P[k]=dh;
			up(dh);
			break;
		case 2:
			fscanf(f,"%d",&x);
			H[P[x]]=H[dh];
			dh--;
			if(V[H[P[x]]]<V[H[P[x]/2]])
				up(P[x]);
			else
				down(P[x]);
			break;
		default:
			fprintf(g,"%d\n",V[H[1]]);
			break;
		}
	}
	
	return 0;
}