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 Ruby (judge verdict: Accepted)

# require 'benchmark'

# result = Benchmark.realtime do

  def divide_sort(array)
    # @count += 1
    length = array.length

    if length <= 1
      return array
    end

    left_array = divide_sort(array[0..((length-1)/2)])
    right_array = divide_sort(array[((length+1)/2)..(length-1)])
    i = 0

    while i < length do
      if left_array[0] < right_array[0]
        @count += 1
        array[i] = left_array.shift
        else
          @count += 1
          array[i] = right_array.shift
      end

      i += 1
      if left_array.length == 0
        while i < length do 
          @count += 1
          array[i] = right_array.shift
          i += 1
        end

      elsif right_array.length == 0
        while i < length do
          @count += 1
          array[i] = left_array.shift
          i += 1
        end
      end
    end
    return array
  end
# end
@count = 0
# buffer = []
array_num = gets.to_i
array = gets.to_s.split(" ").map(&:to_i)

# @count += 1

buffer = divide_sort(array)

# merge_sort(new_array_left,new_array_right)

# puts "処理概要 #{result}s"

puts buffer.join(" ")
puts @count