Cod sursa(job #920306)

Utilizator iarbaCrestez Paul iarba Data 20 martie 2013 10:27:19
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
using namespace std;
long aux,heap[200000],ini[200000],poz[200000],n,i,c,t,k,val,j;
void ridica(int i)
{
	if(heap[i/2]>heap[i]){
		aux=heap[i];heap[i]=heap[i/2];heap[i/2]=aux;
		aux=ini[i];ini[i]=ini[i/2];ini[i/2]=aux;
		aux=poz[ini[i]];poz[ini[i]]=poz[ini[i/2]];poz[ini[i/2]]=aux;
		ridica(i/2);
				   }
}
int main()
{
	freopen("heap.in","r",stdin);
	freopen("heap.out","w",stdout);
	scanf("%ld",&n);heap[0]=0;
	for(i=1;i<=n;i++){
		scanf("%ld",&c);
		if(c==3){printf("%ld ",heap[1]);}
		if(c==1){t++;k++;scanf("%ld",&val);ini[t]=k;heap[t]=val;poz[k]=t;ridica(t);}
		if(c==2){
			t++;k++;scanf("%ld",&val);j=poz[val];ini[j]=0;poz[val]=0;heap[j]=1000000001;
			while(((heap[j]>heap[2*j])||(heap[j]>heap[2*j+1]))&&((heap[2*j])||(heap[2*j+1]))){
				if((heap[2*j]<heap[2*j+1])||(!heap[2*j+1])){
		aux=heap[j];heap[j]=heap[j*2];heap[j*2]=aux;
		aux=ini[j];ini[j]=ini[j*2];ini[j*2]=aux;
		aux=poz[ini[j]];poz[ini[j]]=poz[ini[j*2]];poz[ini[j*2]]=aux;j=j*2;
										 }
				else{
		if(heap[2*j+1]){
		aux=heap[j];heap[j]=heap[j*2+1];heap[j*2+1]=aux;
		aux=ini[j];ini[j]=ini[j*2+1];ini[j*2+1]=aux;
		aux=poz[ini[j]];poz[ini[j]]=poz[ini[j*2+1]];poz[ini[j*2+1]]=aux;j=j*2+1;
					   }
					}
															 }
				}
					 }
return 0;
}