Cod sursa(job #266751)

Utilizator sory1806Sandu Sorina-Gabriela sory1806 Data 26 februarie 2009 08:01:34
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>
#define max 200010
long h[max], n, m, x, y, o;
struct
{       long val, poz;
}       a[max];
FILE *f, *g;

void poz(long x, long p)
{       long i;
	for(i=1; i<=o; i++)
		if(a[i].val==x)
		{	a[i].poz=p;
			break;
		}
}

void ins(long v)
{       long k, z;
	h[++n]=v;
	k=n;
	while(h[k/2]>h[k] && k>1)
	{      	z=h[k]; h[k]=h[k/2]; h[k/2]=z;
		poz(h[k], k);
		poz(h[k/2], k/2);
		k=k/2;
	}
}

void del(long k)
{       long z, m;
	k=a[k].poz;
	z=h[k]; h[k]=h[n]; h[n]=z;
	poz(h[k], k); poz(h[n], 0);
	n--;
	while(( (h[2*k]<h[k] && 2*k<=n) ||
		(h[2*k+1]<h[k] && 2*k+1<=n) )	&& k<n)
	{       if(2*k==n)			m=2*k;
		else	if(h[2*k]<h[2*k+1])	m=2*k;
			else			m=2*k+1;
		z=h[m]; h[m]=h[k]; h[k]=z;
		poz(h[m], m);
		poz(h[k], k);
		k=m;
	}
}

int main()
{       long i;
	f=fopen("heapuri.in", "r");
	g=fopen("heapuri.out", "w");
	fscanf(f, "%ld", &m);
	for(i=1; i<=m; i++)
	{	fscanf(f, "%ld", &x);
		if(x==3)
			fprintf(g, "%ld\n", h[1]);
		else
		{	fscanf(f, "%ld", &y);
			if(x==1)
			{       o++;
				a[o].val=y;
				a[o].poz=n+1;
				ins(y);
			}
			else
				del(y);
		}

	}
	return 0;
}