#include #include struct Node { struct Node *l, *r; unsigned val; int track; } node_pool[ 200000 ], *root; struct Car { unsigned val; struct Car *next; } car_pool[ 200000 ]; struct Track { struct Car *head, *tail; } tracks[ 200001 ]; int buffer[ 200000 ], bufsize; void nodeInsert( struct Node *n ) { struct Node **x; x = &root; while( *x ) { if( n->val < (*x)->val ) x = &(*x)->l; else x = &(*x)->r; } *x = n; } struct Node *getLowest() { struct Node *act = root; struct Node *parent = NULL; if( !act ) return NULL; while( act->l ) { parent = act; act = parent->l; } if( parent ) parent->l = act->r; else root = root->r; return act; } void doInput( int N, int M ) { int i; int car_alloc = 0, node_alloc = 0, track_pos = 0; root = NULL; bufsize = 0; for( i = 0; i < N; ++ i ) { int best = 0; struct Node *act = root; unsigned car; scanf( "%u", &car ); while( act ) { if( act->val <= car ) { best = act->track; act = act->r; } else { act = act->l; } } if( best ) { struct Car *c = car_pool + ( car_alloc ++ ); c->next = NULL; c->val = car; tracks[ best ].tail->next = c; tracks[ best ].tail = c; buffer[ bufsize ++ ] = best; } else { struct Car *c = car_pool + ( car_alloc ++ ); struct Node *n = node_pool + ( node_alloc ++ ); if( track_pos == M ) { printf( "Transportation failed\n" ); return; } best = ( ++ track_pos ); c->next = NULL; c->val = car; tracks[ best ].head = c; tracks[ best ].tail = c; n->val = car; n->track = best; n->l = n->r = NULL; nodeInsert( n ); buffer[ bufsize ++ ] = best; } } for( i = 0; i < bufsize; ++i ) printf( "%u%c", buffer[ i ], ( i == bufsize - 1 ) ? '\n' : ' ' ); root = NULL; node_alloc = 0; for( i = 1; i <= track_pos; ++i ) { struct Node *n = node_pool + ( node_alloc ++ ); n->val = tracks[ i ].head->val; n->track = i; n->l = n->r = NULL; nodeInsert( n ); } { struct Node *act; while( ( act = getLowest() ) ) { printf( "%i ", act->track ); if( tracks[ act->track ].head->next ) { tracks[ act->track ].head = tracks[ act->track ].head->next; act->val = tracks[ act->track ].head->val; act->l = act->r = 0; nodeInsert( act ); } } } putchar( '\n' ); } int main( int argc, char **argv ) { for( ;; ) { int M, N; scanf( "%i%i", &N, &M ); if( !M || !N ) return 0; doInput( N, M ); } return 0; }