Cod sursa(job #563458)

Utilizator Robert29FMI Tilica Robert Robert29 Data 25 martie 2011 10:19:51
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<stdio.h>
FILE*f=fopen("heapuri.in","r");
FILE*g=fopen("heapuri.out","w");
int n,i,x,l,v[200001],w[200001],q[200001];
void insert(int z){
	int k=z;
	int j=v[0];
	while(v[j/2]>k&&j>1){
		v[j]=v[j/2];
		w[j]=w[j/2];
		q[w[j]]=j;
		j=j/2;
	}
	v[j]=k;
	w[j]=++l;
	q[w[j]]=j;
}
void sterge(int poz){
	int aux=v[v[0]];
	int aux1=w[v[0]];
	v[v[0]]=v[poz];
	v[poz]=aux;
	w[poz]=aux1;
	q[w[poz]]=j;
	v[0]--;
		
	int k=v[poz];
	int kk=w[poz];
	int j=poz;
	if(v[2*j]<v[j]||v[2*j+1]<v[j]){
		
		int ok=1;
		while(ok){
			int son=0;
			if(2*j<=v[0]&&v[2*j]<k)
				son=2*j;
			if((2*j+1)<=v[0]&&v[2*j+1]<v[2*j]&&v[2*j+1]<k)
				son=2*j+1;
			if(son==0)
				ok=0;
			v[son]=v[j];
			w[son]=w[j];
			q[w[son]]=son;
		}
		v[j]=k;
		w[j]=kk;
		q[w[j]]=j;
	}else{
		
	int k=poz;
	int jj=
	int j=v[0];
	while(v[j/2]>k&&j>1){
		v[j]=v[j/2];
		w[j]=w[j/2];
		j=j/2;
	}
	v[j]=k;

	}
		
}
int main() {
	fscanf(f,"%d",&n);
	for(i=1;i<=n;++i){
		fscanf(f,"%d",&x);
		if(x==1){
			fscanf(f,"%d",&x);
			v[0]++;
			insert(x);
		}else if(x==2){
			fscanf(f,"%d",&x);
			sterge(w[q[x]]);
		}else
			fprintf(g,"%d\n",v[1]);
	}
	
	fclose(g);
	fclose(f);
	return 0;
}