/* prog8.5.c */
#include <stdio.h>
#include <stdlib.h>

typedef int Item;

#define key(A) (A)
#define less(A, B) (key(A) < key(B))
#define exch(A, B) { Item t = A; A = B; B = t; } 
#define compexch(A, B) if (less(B, A)) exch(A, B)

Item* aux;

void merge(Item a[], int l, int m, int r)
  { int i, j, k;
    for (i = m+1; i > l; i--) aux[i-1] = a[i-1];
    for (j = m; j < r; j++) aux[r+m-j] = a[j+1];
    for (k = l; k <= r; k++)
       if (less(aux[i], aux[j])) 
          a[k] = aux[i++]; else a[k] = aux[j--];
  }

#define min(A, B) (A < B) ? A : B
void mergesortBU(Item a[], int l, int r)
  { int i, m;
    for (m = 1; m <= r-l; m = m+m)
      for (i = l; i <= r-m; i += m+m)
        merge(a, i, i+m-1, min(i+m+m-1, r));
  }

int main(int argc, char *argv[])
{ int i, N = atoi(argv[1]), sw = atoi(argv[2]), seed = atoi(argv[3]);
    Item* a = malloc(N*sizeof(Item));
    aux = malloc(N*sizeof(Item));
    srandom(seed);
    if (sw) 
      for (i = 0; i < N; i++) 
        /* a[i] = 1000*(1.0*rand()/RAND_MAX); */
        a[i] = random();
    else {
      N=0;
      while (scanf("%d", &a[N]) == 1) N++;
    }
    mergesortBU(a, 0, N-1);
    for (i = 0; i < N; i++) printf("%10d\n", a[i]);
    printf("\n");
    return 0;
  }
