Cod sursa(job #163811)

Utilizator razvi9Jurca Razvan razvi9 Data 23 martie 2008 10:50:28
Problema Sortare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include<cstdio>
const int max=5001;
int n,nr[max],m,i,j,k,x[max],y[max],z[max],last[max],a[max];
int _m(int a,int b){if(a<b) return b;return a;}
int getmax(int x,int y,int z){return _m(x,_m(y,z));}
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;
	else
		if(x<z) return x;
		else
			if(y<z) return z;
			else return y;
}
int getdouble(int x,int y,int z){if(x==y) return x;	if(y==z) return y;	return x;}
void build(int n)
{
	if(n<1) return;
	if(n==1) {a[1]=1;return;}
	build(last[n]);
	if(z[n]==0){
		m=last[n];
		k=m+2;
		if(m<x[n])
			for(i=m+1;i<x[n];i++,k++)
				a[i]=k;
		else
			for(i=m;i>=x[n];i--)
				a[i+1]=a[i];
		a[x[n]]=m+1;
		for(i=_m(m+2,x[n]+1);i<=n;i++,k++)
			a[i]=k;
		return;}
	m=last[n];
	k=m+2;
	if(m<x[n])
		for(i=m+1;i<x[n];i++,k++)
				a[i]=k;
	else
		for(i=m;i>=x[n];i--)
			a[i+1]=a[i];
	a[x[n]]=m+1;
	m++;
	if(m<y[n])
		for(i=m+1;i<y[n];i++,k++)
				a[i]=k;
	else
		for(i=m;i>=y[n];i--)
			a[i+1]=a[i];
	a[y[n]]=n;
	for(i=_m(m+2,y[n]+1);i<=n;i++,k++)
		a[i]=k;
}
int main()
{
	freopen("sortare.in","r",stdin);
	freopen("sortare.out","w",stdout);
	scanf("%d",&n);
	nr[1]=1;
	for(i=2;i<=n;i++){
		scanf("%d %d %d",&x[i],&y[i],&z[i]);
		if(x[i]==y[i] && y[i]==z[i]){
			z[i]=0;
			m=i-1;
			for(j=i-2;j>nr[m];j--)
				if(nr[j]>nr[m]) m=j;
			nr[i]=nr[m]+1;
			last[i]=m;}
		else
			if(x[i]==y[i] || y[i]==z[i] || z[i]==x[i]){
				x[i]=getdouble(x[i],y[i],z[i]);
				z[i]=0;
				m=i-1;
				for(j=i-2;j>nr[m];j--)
					if(nr[j]>nr[m]) m=j;
				nr[i]=nr[m]+1;
				last[i]=m;}
			else{
				j=getmed(x[i],y[i],z[i]);
				y[i]=getmax(x[i],y[i],z[i]);
				x[i]=j;
				z[i]=1;
				m=i-2;
				for(j=i-3;j>nr[m];j--)
					if(nr[j]>nr[m]) m=j;
				nr[i]=nr[m]+1;
				last[i]=m;}}
	printf("%d\n",nr[n]);	
	build(n);
	for(i=1;i<=n;i++)
		printf("%d ",a[i]);
	fclose(stdout);
	return 0;
}