>>366
# include <stdlib.h>
# include <string.h>
void merge(int *a, int *b, int *out, int size)
{
  int *orig_out = out;
  int i = 0, j = 0;
  while(i < size || j < size)
    if(j >= size || i < size && a[i] < b[j])
      *out++ = a[i++];
    else
      *out++ = b[j++];
}
void mergesort(int *a, int k)
{
  int i;
  int *temp = malloc((1 << k) * sizeof(int));
  if(!temp) perror("malloc"), exit(1);
  for(i = 0; i < k; i++)
  {
    int n = 1 << i;
    int j;
    for(j = 0; j < 1 << k - i - 1; j++)
    {
      int *x = a + 2 * j * n;
      merge(x, x + n, temp, n);
      memcpy(x, temp, n * 2 * sizeof(int));
    }
  }
  free(temp);
}