Cod sursa(job #163519)

Utilizator VmanDuta Vlad Vman Data 22 martie 2008 14:39:55
Problema Sortare Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasa a 10-a Marime 1.34 kb
#include <stdio.h>

#define Nmax 50005

int N,i;
int A[Nmax],B[Nmax],C[Nmax];
int set[Nmax],P[Nmax];
int maxdepth;

inline int maxim(int a,int b) { return a>b?a:b; }

void citire()
{
 freopen("sortare.in","r",stdin);
 scanf("%d",&N);
 for (i=2;i<=N;++i)
      scanf("%d %d %d",&A[i],&B[i],&C[i]);
}      

void solve(int lvl,int poz,int max,int depth)
{
 int i,j,where;
 maxdepth=maxim(depth,maxdepth);
 if (lvl==1)
    {
     for (i=max;set[i]==1;--i);
     P[poz]=i;
     set[i]=1;
     return;
    }
 if (A[lvl]==B[lvl] || A[lvl]==C[lvl] || B[lvl]==C[lvl])
    {
     set[max]=1;
     if (A[lvl]==B[lvl] || A[lvl]==C[lvl]) P[poz+A[lvl]-1]=max;
        else if (B[lvl]==C[lvl]) P[poz+B[lvl]-1]=max;
     solve(lvl-1,poz,max-1,depth+1);
    }
    else
    {
     //cauta elementul mijlociu
     for (j=max;set[j]==1;--j);     
     for (i=j-1;set[i]==1;--i);
     //pune elementul in permutare
     set[i]=1;
     where=maxim(A[lvl],maxim(B[lvl],C[lvl]));
     P[poz+where-1]=i;
     //rezolva pt intervalele ramase
     if (where==lvl) where-=2;
     solve(1,poz+where,j,depth+1);
     solve(lvl-2,poz,i-1,depth+1);
    }
}

int main()
{
 citire();
 solve(N,1,N,1);
 freopen("sortare.out","w",stdout);
 printf("%d\n",maxdepth);
 for (i=1;i<=N;++i)
     printf("%d ",P[i]);
 fclose(stdout);
 return 0;
}