Cod sursa(job #163489)

Utilizator razvi9Jurca Razvan razvi9 Data 22 martie 2008 13:26:56
Problema Sortare Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasa a 10-a Marime 1.31 kb
#include<cstdio>
int n,a[5001],x[5001],y[5001],z[5001],nr,i;
inline int getnumber(int x,int y,int z)
{
	if(x==y)
		if(y==z) 
			return 1;
		else 
			return 2;
	else
		if(y==z)
			return 2;
		else return 3;
}
inline int rem(int aux)
{
	if(aux==1) return 1;
	return aux-1;
}
inline int max(int x,int y){if(x<y)return y;return x;}
inline int getmax(int x,int y,int z)
{
	return max(x,max(y,z));
}
inline int getmed(int x,int y,int z)
{
	if(x<y)
		if(y<z)
			return y;
		else
			if(x<z)
				return z;
			else 
				return x;
}

void getsol(int n)
{
	int aux,aux2;
	nr++;
	if(n<=1) {if(n==1)a[1]=1;return;}
	aux=getnumber(x[n],y[n],z[n]);
	getsol(n-rem(aux));
	if(aux==1){
		for(i=n-1;i>=x[n];i--)
			a[i+1]=a[i];
		a[x[n]]=n;
		return;}
	if(aux==2){
		aux=getmax(x[n],y[n],y[n]);
		for(i=n-1;i>=aux;i--)
			a[i+1]=a[i];
		a[aux]=n;
		return;}
	aux=getmax(x[n],y[n],z[n]);
	for(i=n-2;i>=aux-1;i--)
		a[i+2]=a[i];
	a[aux]=n;
	aux2=getmed(x[n],y[n],z[n]);
	for(i=aux-2;i>=aux2;i--)
		a[i+1]=a[i];
	a[aux2]=n-1;	
}
int main()
{
	freopen("sortare.in","r",stdin);
	freopen("sortare.out","w",stdout);
	scanf("%d",&n);
	for(i=2;i<=n;i++)
		scanf("%d %d %d",&x[i],&y[i],&z[i]);
	getsol(n);
	printf("%d\n",nr);
	for(i=1;i<=n;i++)
		printf("%d ",a[i]);
	fclose(stdout);
	return 0;
}