Cod sursa(job #613227)

Utilizator KoniacDocea Andrei Koniac Data 18 septembrie 2011 21:29:51
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<stdio.h>

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

int n,z,x,i,son,l;
int poz[200001],w[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];
		w[poz[j]]=j;
		j=j/2;
	}
	v[j]=key;
	poz[j]=l++;
	w[l]=j;
}
void down(int k){
	
	v[k]=v[v[0]];
	poz[k]=poz[v[0]];
	w[poz[k]]=k;
	v[0]--;
	int j=k;
	
	if(v[j/2]>v[j]){
		int key=v[j];
		int key1=poz[k];
		while(v[j/2]>key&&j>1){
			v[j]=v[j/2];
			poz[j]=poz[j/2];
			
			w[poz[j]]=j;
			j/=2;
		}
		v[j]=key;
		poz[j]=key1;
		w[poz[j]]=j;
	}
	else {
		int ok=1;
		int key=v[k];
		int key1=poz[k];
		while(ok){
			son=0;
			if(2*j<=v[0])
				if(v[2*j]<key)
					son=2*j;
			if(2*j+1<=v[0])
				if(v[2*j+1]<key&&v[2*j+1]<v[2*j])
					son=2*j+1;
			if(son){	
				v[j]=v[son];
				poz[j]=poz[son];
				w[poz[j]]=j;
				j=son;
			}else
				ok=0;
		}
		v[j]=key;
		poz[j]=key1;
		w[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(w[x]);
		}
		else
			fprintf(g,"%d\n",v[1]);	
	}
	fclose(f);
	fclose(g);
	return 0;
}