Cod sursa(job #18108)

Utilizator TheCreeepIonita Andrei Lucian TheCreeep Data 18 februarie 2007 09:13:11
Problema Culori Scor 0
Compilator c Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 0.8 kb
#include <stdio.h>
int x[251],y[251],z[251][251],max,n,i,j,k,s[312501],m[312501],p[312501];
FILE *f;
void unite (int *a, int *b)
{
	while (p[*a]!=*a) *a=p[p[*a]];
	while (p[*b]!=*b) *b=p[p[*b]];
	p[*b]=*a;
	s[*a]+=s[*b];
	s[*b]=0;
	if (s[*a]>max) max=s[*a];
}
void add(int x, int y)
{
	k++;
	p[k]=k;
	s[k]=1;
	z[x][y]=k;
	if (z[x+1][y]!=0) unite (&z[x+1][y],&z[x][y]);
	if (z[x-1][y]!=0) unite (&z[x-1][y],&z[x][y]);
	if (z[x][y+1]!=0) unite (&z[x][y+1],&z[x][y]);
	if (z[x][y-1]!=0) unite (&z[x][y-1],&z[x][y]);
	m[k]=max;
}
int main (void)
{
	f=fopen("bile.in","r");
	fscanf(f,"%d",&n);
	for(i=n*n;i>0;i--)
		fscanf(f,"%d %d",&x[i],&y[i]);
	fclose(f);
	k=0;
	max=1;
	for(i=1;i<=n*n;i++)
	{
		add(x[i],y[i]);
	}
	f=fopen("bile.out","w");
	for(i=n*n-1;i>=0;i--)
	{
		fprintf(f,"%d\n",m[i]);
	}
	fclose(f);
	return 0;
}