Cod sursa(job #299450)

Utilizator stanesealexStanese Alex stanesealex Data 6 aprilie 2009 19:43:34
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#define N 200010

using namespace std;

int n,h[N],poz[N];
void adaugare(int x)
{
	int g,nr;
	n++;
	nr=n;
	poz[n]=n;
	h[n]=x;
	while (h[nr/2]<h[nr]&&nr>=2)
	{
		g=h[nr/2];
		h[nr/2]=h[nr];
		h[nr]=g;
		g=poz[nr];
		poz[nr]=poz[nr/2];
		poz[nr/2]=g;	
		nr=nr/2;
	}
}
void stergere(int x)
{
	int k,g,nr,i=1;
	while (poz[i]!=x)
		i++;
	h[i]=h[n];
	h[n]=0;
	poz[i]=poz[n];
	poz[n]=0;
	nr=n-1;
	k=i;
	while ((h[k]<h[2*k]||h[k]<h[2*k+1])&&2*k<=n)
	{
	if (h[k]<h[2*k])
	{
		g=h[k];
		h[k]=h[k*2];
		h[k*2]=g;
		g=poz[i];
		poz[i]=poz[i*2];
		poz[i*2]=g;
		k=k*2;
	}
	else
		if (h[k]<h[2*k+1])
		{
		g=h[k];
		h[k]=h[k*2+1];
		h[k*2+1]=g;
		g=poz[i];
		poz[i]=poz[i*2+1];
		poz[i*2+1]=g;
		k=k*2+1;
		}
	}
}
int main ()
{
	int m,i,x,k,j,min=150000;
	FILE *f=fopen("heapuri.in","r");
	FILE *g=fopen("heapuri.out","w");
	fscanf(f,"%d ",&m);
	for (i=1;i<=m;i++)
	{
		fscanf(f,"%d",&k);
		if (k==1)
		{
			fscanf(f,"%d",&x);
			adaugare(x);
		}
		if (k==2)
		{
			fscanf(f,"%d",&x);
			stergere(x);
		}
		if (k==3)
		{min=150000;
			for (j=n;j>n/2-1;j--)
			{
				if(h[j]<min&&j!=0&&h[j]!=0) 
				min=h[j];
			}
		fprintf(g,"%d ",min);
		fprintf(g,"\n");
		}
	}
fclose(f);
fclose(g);
return 0;
}