Cod sursa(job #161034)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 17 martie 2008 16:11:43
Problema Sortare Scor Ascuns
Compilator cpp Status done
Runda Marime 0.89 kb
#include <stdio.h>
#include <assert.h>

#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define nmax 5002

int sol,n,P[nmax],A[nmax],B[nmax],C[nmax];

void doit(int n);

void baga(int n,int a,int b,int j)
{
	int i,x=-j;
	doit(n+j);
	for(i=n;i;--i)
	{
		if(i==a)
			P[i]=1,j++;
		else
			if(i==b)
				P[i]=2,j++;
			else
				P[i]=P[i+j]+x;
	}
}

void doit(int n)
{
	sol++;
	if(n==1)
	{
		P[1]=1;
		return ;
	}
	if(A[n]!=B[n] && B[n]!=C[n] && A[n]!=C[n])
		baga(n,A[n],B[n],-2);
	else
		baga(n,(A[n]==B[n] || A[n]==C[n])?A[n]:C[n],-1,-1);
}

int main()
{
	freopen("sortare.in","r",stdin);
	freopen("sortare.out","w",stdout);
	scanf("%d",&n);
	assert(1<=n && n<=5000);
	int i;
	FOR(i,2,n+1)
	{
		scanf("%d %d %d",&A[i],&B[i],&C[i]);
		assert(1<=A[i] && A[i]<=i);
		assert(1<=B[i] && B[i]<=i);
		assert(1<=C[i] && C[i]<=i);
	}
	doit(n);
	printf("%d\n",sol);
	FOR(i,1,n+1)
		printf("%d ",P[i]);
	printf("\n");
	return 0;
}