Cod sursa(job #713874)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 15 martie 2012 08:02:04
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<stdio.h>
#define val 200010

int H[val],aux,i,V[val],e;
short int Z[1000000010];

const char InFile[]="heapuri.in";
const char OutFile[]="heapuri.out";

FILE*f=fopen(InFile,"r");
FILE*g=fopen(OutFile,"w");

int father(int nod){
	return nod/2;
}
int left_son(int nod){
	return nod*2;
}
int right_son(int nod){
	return nod*2+1;
}

void sift(int N,int k){
	int son;
	do{
		son=0;
		if(!((son=left_son(k))<=N))
			son=0;
		if(son&&right_son(k)<=N&&H[right_son(k)]<H[left_son(k)])
			son=right_son(k);
		if(son&&H[k]<H[son])
			son=0;
		if(son){
			aux=H[k];
			Z[H[son]]=k;
			H[k]=H[son];
			Z[aux]=son;
			H[son]=aux;
		}
	}while(son);
}

void percolate(int N,int k){
	int key=H[k];
	while(k>1&&(key<H[father(k)])){
		H[k]=H[father(k)];
		Z[H[father(k)]]=k;
		k=father(k);
	}
	H[k]=key;
	Z[H[k]]=k; ;
}

int main(){
	int q, operatie, nr,N=0,k;
	fscanf(f,"%d",&q);
	for(i=1;i<=q;i++){
		fscanf(f,"%d",&operatie);
		switch(operatie){
		case 1:
			fscanf(f,"%d",&nr);
			H[++N]=nr;
			V[++e]=nr;
			Z[nr]=N;
			percolate(N,N);
			break;
		case 2:
			fscanf(f,"%d",&nr);
			k=Z[V[nr]];
			H[k]=H[N];
			N--;
			if(k>1&&H[k]<H[father(k)])
				percolate(N,k);
			else
				sift(N,k);
			break;
		default:
			fprintf(g,"%d\n",H[1]);
			break;
		}
	}
	
}