#include #include using namespace std; int smola; int m,n; vector < int > odp1; vector < int > odp2; vector < vector < int > > kolaje; vector < int > vlak; // int [] vlak; void Destroy(){ odp1.clear(); odp2.clear(); kolaje.clear(); vlak.clear(); smola=1; } void PosunVector( int i ){ //printf (" PosunVector >>> \n"); //for ( int j = 0 ; j < kolaje[ i ].size() ; ++j ) printf ( " %d ", kolaje[ i ][ j ] ); kolaje[ i ].erase ( kolaje[ i ].begin()); //printf ("\n"); //for ( int j = 0 ; j < kolaje[ i ].size() ; ++j ) printf ( " %d ", kolaje[ i ][ j ] ); //printf ("\n"); } int Dalsie ( int nn ) { //printf ( "Dalsie>> hladam: %d\n ",nn+1 ); for ( int i = 0 ; i < m ; ++i ){ //printf ( "Dalsie>> %d\n ", kolaje[i][0] ); if ( kolaje[ i ][ 0 ] == (nn+1) ) return i; } return 0; } int Nacitaj () { //peto spravi //printf ( "Nacitaj zacina \n " ); int x; scanf ( "%d %d\n", &n, &m ); if ( ( n == 0 ) && ( m == 0 ) ) { //koniec=1; return 1 ; } for ( int i = 0 ; i < n ; ++i ){ scanf ( "%d", &x ); vlak.push_back ( x ); } return 0; } void Init(){ //printf ( "Init zacina \n " ); vector < int > x; for ( int i = 0 ; i < m ; ++i ) { // prvy prvok je nula - dolezite !!! kolaje.push_back( x ); kolaje[ i ].push_back( 0 ); } } void Najdi(){ /*for ( int i=0 ; i < n ; ++i) { printf ( "vlak >> %d\n", vlak[ i ]); }*/ //printf ( "Najdi zacina \n " ); int k = 0; if ( m > 100 ) k=m-1; for ( int i = 0 ; i < k ; ++i){ odp1.push_back( i ); kolaje[ i ].push_back ( vlak [ i ] ); } for ( int i = k ; i < n ; ++i ){ smola=1; for ( int j = k ; j < m ; ++j ){ if ( vlak[ i ] > kolaje [ j ][ kolaje [ j ].size() - 1 ] ){ //printf ( "Najdi >> vlak: %d - kolaje: %d \n", vlak[ i ],kolaje [ j ][ kolaje [ j ].size() - 1 ]); kolaje [ j ].push_back ( vlak [ i ] ); odp1.push_back ( j ); smola=0; //printf ( "kde: %d - co:%d\n", j, kolaje[ j ] [ (kolaje [ j ].size() - 1)]); break; } } } //printf ( " smola = %d \n", smola ); for ( int i = 0 ; i < m ; ++i ){ PosunVector( i ); /*for ( int j = 0 ; j < kolaje[ i ] .size() ; ++j ) printf ( "%d ", kolaje[i][j]); printf( "\n");*/ } //printf ( " Najdi Konci "); } void Poskladaj(){ odp2.clear(); //printf ( "Poskladaj zacina \n " ); for ( int i = 0 ; i < n ; ++ i ) { int j = Dalsie ( i ); //printf ( "cislo: %d - vector %d \n", i+1, j); odp2.push_back ( j ); PosunVector ( j ); } } void Vypis(){ //printf ( "Vypis zacina \n " ); if ( smola ) printf( "Transportation failed\n" ); else { for ( int i = 0 ; i < n ; ++i ) { printf ( "%d ", odp1[ i ]+1 ); } printf( "\n" ); for ( int i = 0 ; i < n ; ++i ) { printf ( "%d ", odp2[ i ] +1); } printf( "\n" ); } } int main() { while ( Nacitaj() == 0){ Init(); Najdi(); if ( smola == 0) Poskladaj(); Vypis(); Destroy(); } return 0; }