Cod sursa(job #563470)

Utilizator Robert29FMI Tilica Robert Robert29 Data 25 martie 2011 11:23:11
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<stdio.h>
FILE*f=fopen("heapuri.in","r");
FILE*g=fopen("heapuri.out","w");
int n,z,x,i,son,l,poz[200001],t[200001],v[200001];
void insert(int k){
	int key=k;
	++v[0];
	int j=v[0];
	while(v[j/2]>k&&j>1){
		v[j]=v[j/2];
		poz[j]=poz[j/2];
		j=j/2;
		t[poz[j]]=j;
	}
	v[j]=key;
	poz[j]=++l;
	t[l]=j;
}
void down(int k){
	v[k]=v[v[0]];
	poz[k]=poz[v[0]];
	v[0]--;
	int j=k;
	
	if(v[j/2]>v[j]){
		int key=v[j];
		while(v[j/2]>v[j]&&j>1){
			v[j]=v[j/2];
			poz[j]=poz[j/2];
			j/=2;
			t[poz[j]]=j;
		}
		v[j]=key;
		poz[j]=poz[k];
		t[poz[j]]=j;
	}
	else {
		int ok=1;
		while(ok){
			son=0;
			if(2*j<=v[0])
				if(v[2*j]<v[j])
					son=2*j;
			if(2*j+1<=v[0])
				if(v[2*j+1]<v[j]&&v[2*j+1]<v[2*j])
					son=2*j+1;
			if(son){	
				v[j]=v[son];
				poz[j]=poz[son];
				t[poz[j]]=j;
				j=son;
			}else
				ok=0;
						
		}
		v[j]=v[k];
		poz[j]=poz[k];
		t[poz[j]]=j;
	}
	
	
}
int main() {
	fscanf(f,"%d",&n);
	for(i=1;i<=n;++i){
		fscanf(f,"%d",&z);
		if(z==1){
			fscanf(f,"%d",&x);
			insert(x);
		}else if(z==2){
			fscanf(f,"%d",&x);
			down(t[x]);
		}else
			fprintf(g,"%d\n",v[1]);	
	}
	fclose(g);
	fclose(f);
	return 0;
}