
#include <stdio.h>

#define QUICK
#define VERIFY

#ifdef QUICK
#define n 10
int a[] = {7, 9, 2, 4, 10, 5, 1, 8, 3, 6};
int example_a[] = {7, 9, 2, 4, 10, 5, 1, 8, 3, 6};
#else

#define n 10000
int a[n];
int example_a[n];
#endif

int sort(void) {
  #include "sort.inc"
}

int example_sort(void) {
  void example_inner_sort(int left, int right) {
    int pivot, l=left, r=right;
    if (l >= r)
      return;
    pivot = example_a[l];
    while (1) {
      while (l<r && example_a[r] > pivot) {
        r--;
      }
      if (l==r) {
        example_a[l] = pivot;
        break;
      } else {
        example_a[l] = example_a[r];
      }
      while (l<r && example_a[l] < pivot) {
        l++;
      }
      if (l==r) {
        example_a[r] = pivot;
        break;
      } else {
        example_a[r] = example_a[l];
      }
    }
    example_inner_sort(left, l-1);
    example_inner_sort(r+1, right);
  }
  example_inner_sort(0, n-1);
}

int main(void) {
  int i;
  
  #ifndef QUICK
  for (i = 0; i < n; i++) {
    a[i] = rand();
    example_a[i] = a[i];
  }
  #endif
  
  sort();
  
  #ifdef VERIFY
  example_sort();
  #endif
  
  #ifdef QUICK
  #ifdef VERIFY
  printf("Example: ");
  for (i = 0; i < n; i++) {
    printf("%d,", example_a[i]);
  }
  printf("\n");
  printf("Yours:   ");
  #endif
  for (i = 0; i < n; i++) {
    printf("%d,", a[i]);
  }
  printf("\n");
  
  #else
  #ifdef VERIFY
  for (i = 0; i < n; i++) {
    if (a[i] != example_a[i]) {
      printf("Failed\n");
      return;
    }
  }
  printf("Success\n");
  #else
  printf("Completed\n");
  #endif
  #endif
}

