/* prog6.1.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)

int N; 

void dump_vector(Item a[], int l, int r)
{
  int i;
  for (i=l; i<=r; i++) 
    printf("%d ", a[i]);
  printf("\n");
}

int partition(Item a[], int l, int r)
  { int i = l-1, j = r; Item v = a[r];
    for (;;)
      { 
        while (less(a[++i], v)) ;
        while (less(v, a[--j])) if (j == l) break;
        if (i >= j) break;
        exch(a[i], a[j]);
      }
    exch(a[i], a[r]);
    return i;
  }

void quicksort(Item a[], int l, int r)
  { int i;
    if (r <= l) return;
    i = partition(a, l, r);
    printf("[l r i = %2d %2d %2d] ", l, r, i);
    dump_vector(a, 0, N-1);
    quicksort(a, l, i-1);
    quicksort(a, i+1, r);
  }

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