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 Haskell (judge verdict: Time Limit Exceeded)

sort :: (Ord a) => Int -> [a] -> [a]
sort _ [] = []
sort _ [a] = [a]
sort right arr = merge (sort mid (take mid arr)) (sort (right - mid) (drop mid arr))
  where
    mid = div right 2
    merge :: (Ord a) => [a] -> [a] -> [a]
    merge [] a = a
    merge a [] = a
    merge (a:ar) (b:br)
      |a < b = a : merge ar (b:br)
      |otherwise = b : merge (a:ar) br
mergeSort :: Int -> Int -> Int
mergeSort left right
  |left + 1 < right = (right - left) + mergeSort left mid + mergeSort mid right
  |otherwise = 0
  where
    mid = div (left + right) 2

join' :: (Show a) => Char -> [a] -> String
join' _ [a] = show a
join' c (h:t) = (show h) ++ (c:join' c t)

main :: IO ()
main = do
  n <- fmap (\m -> read m :: Int) getLine
  arr <- fmap ((map (\m -> read m :: Int)) . words) getContents
  putStrLn $ join' ' ' (sort n arr)
  print $ mergeSort 0 n