Pagini recente » Cod sursa (job #2231687) | Cod sursa (job #2455534) | Cod sursa (job #446344) | Cod sursa (job #2595033) | Cod sursa (job #163811)
Cod sursa(job #163811)
#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;
}