/*
 * This code is from "Algorithms in C, Third Edition,"
 * by Robert Sedgewick, Addison Wesley Longman, 1998.
 */

#include <stdio.h>
#include <stdlib.h>

#define exch(A, B) { int t = A; A = B; B = t; } 

#define M 100000

#define bitsword    32
#define bitsbyte     8
#define bytesword    4
#define bitsdigit    1
#define R            (1<<bitsdigit)

#define digit(A,B) (((A) >> (bitsword-((B)+1)*bitsdigit)) & (R-1))

void quicksortB(int a[], int l, int r, int w)
  { int i = l, j = r;
    if (r <= l || w > bitsword) return;
    while (j != i)
      { 
        while (digit(a[i], w) == 0 && (i < j)) i++;
        while (digit(a[j], w) == 1 && (j > i)) j--;
        exch(a[i], a[j]);
      }
    if (digit(a[r], w) == 0) j++;
    quicksortB(a, l, j-1, w+1);
    quicksortB(a, j, r, w+1);
  }

void sort(int a[], int l, int r)
  { 
    quicksortB(a, l, r, 0);
  }

int main(int argc, char *argv[])
  { int i, N = atoi(argv[1]), sw = atoi(argv[2]);
    int *a = malloc(N*sizeof(int));
    if (sw) 
      for (i = 0; i < N; i++) 
        a[i] = M*(1.0*rand()/0x80000000);
    else {
      N=0;
      while (scanf("%d", &a[N]) == 1) N++;
    }
    sort(a, 0, N-1);
    for (i = 0; i < N; i++) printf("%3d ", a[i]);
    printf("\n");
    return 0;
  }
