Cod sursa(job #320461)

Utilizator stanesealexStanese Alex stanesealex Data 4 iunie 2009 19:01:09
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cstdio>

using namespace std;


int h[100010],n,ord[100010],n2;

void inserare(int x)
{
	int i,s,i2=n+1,s2;
	n++;
	n2++;
	h[n]=x;
	i=n;
	ord[n]=n2;
	while (h[i]<h[i/2])
	{
		s=h[i];
		s2=ord[i];
		ord[i]=ord[i/2];
		ord[i/2]=s2;
		h[i]=h[i/2];
		h[i/2]=s;
		i2=i;
		i=i/2;
	}
}

void stergere (int x)
{
	int i,s,s2,j=1;;
	while (ord[j]!=x)
		j++;
	h[j]=h[n];
	ord[j]=ord[n];
	h[n]=0;
	ord[n]=0;
	n--;
	i=j;
	if (h[i]>h[i*2] || h[i]>h[i*2+1])
	{
		s2=i;
		while (h[i]>h[i*2]&&i*2<=n)
		{
			s=h[i];
			h[i]=h[i*2];
			h[i*2]=s;
			s=ord[i];
			ord[i]=ord[i*2];
			ord[i*2]=s;
			i=i*2;
		}
		i=s2;
		while(h[i]>h[i*2+1]&&i*2+1<=n)
		{
			s=h[i];
			h[i]=h[i*2+1];
			h[i*2+1]=s;
			s=ord[i];
			ord[i]=ord[i*2+1];
			ord[i*2+1]=s;
			i=i*2+1;
		}
	}	
}

int main()
{
	int i,a,b,m;
	FILE *f=fopen("heapuri.in","r");
	FILE *g=fopen("heapuri.out","w");
	fscanf(f,"%d ",&m);
	for (i=0;i<m;i++)
	{
		fscanf(f,"%d ",&a);
		if (a==1)
		{
			fscanf(f,"%d ",&b);
			inserare(b);
		}
		if (a==2)
		{
			fscanf(f,"%d ",&b);
			stergere(b);
		}
		if (a==3)
			{
				fprintf(g,"%d ",h[1]);
				fprintf(g,"\n");
			}		
	}
	fclose(f);
	fclose(g);
	return 0;
}