Problem:
Merge Sort

Write a program of a Merge Sort algorithm implemented by the following pseudocode. You should also report the number of comparisons in the Merge function.

Merge(A, left, mid, right)
n1 = mid - left;
n2 = right - mid;
create array L[0...n1], R[0...n2]
for i = 0 to n1-1
do L[i] = A[left + i]
for i = 0 to n2-1
do R[i] = A[mid + i]
L[n1] = SENTINEL
R[n2] = SENTINEL
i = 0;
j = 0;
for k = left to right-1
if L[i] <= R[j]
then A[k] = L[i]
i = i + 1
else A[k] = R[j]
j = j + 1

Merge-Sort(A, left, right){
if left+1 < right
then mid = (left + right)/2;
call Merge-Sort(A, left, mid)
call Merge-Sort(A, mid, right)
call Merge(A, left, mid, right)

Input

In the first line n is given. In the second line, n integers are given.

Output

In the first line, print the sequence S. Two consequtive elements should be separated by a space character.

In the second line, print the number of comparisons.

Constraints

n ≤ 500000

0 ≤ an element in S ≤ 109

Sample Input 1

10
8 5 9 2 6 3 7 1 10 4

Sample Output 1

1 2 3 4 5 6 7 8 9 10
34

Notes

Solution in JAVA (judge verdict: Wrong Answer)

import java.util.Scanner;

public class Main {
  private static long counter = 0;

  private static void mergeSort(int[] array, int low, int high) {
    if (low < high) {
      int medium = (low + high) / 2;
      mergeSort(array, low, medium);
      mergeSort(array, medium + 1, high);
      merge(array, low, medium, high);
    }
  }

  private static void merge(int[] array, int low, int medium, int high) {
    int[] buffer = new int[array.length];
    for (int i = low; i < high; i++) {
      buffer[i] = array[i];
    }

    int left = low;
    int right = medium +1;
    int current = low;

    while (left <= medium && right <= high) {
      if (buffer[left] < buffer[right]) {
        array[current] = buffer[left];
        left++;
      } else {
        array[current] = buffer[right];
        right++;
      }
      current++;
      counter++;
    }
    int remaining = medium - left;
    while(remaining >= 0) {
      array[left] = buffer[left];
      left++;
      remaining--;
    }
  }

  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String str = scan.next();

    int N = Integer.valueOf(str);

    //String input = parsed[1];
    int[] array = new int[N];
    for (int i = 0; i < N; i++) {
      array[i] = scan.nextInt();
    }   

    mergeSort(array, 0, array.length - 1); 

    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < N; i++) {
      builder.append(array[i]);
      builder.append(" ");
    }
    builder.append("\n");
    builder.append(counter);
    System.out.println(builder.toString().trim());

  }
}