

INF = 10000000000
count = 0

def merge(A, left, mid, right):
    global count 
    L = A[left:mid] + [INF]
    R = A[mid:right] + [INF]
      
    i, j = 0, 0
    for k in range(left, right):
        count = count + 1
        if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1
    return count
  
def mergeSort(A, left, right):
    if left + 1 < right:
        mid = (left + right) // 2
        countL = mergeSort(A, left, mid)
        countR = mergeSort(A, mid, right)
        return merge(A, left, mid, right)
         
    return 0
          
  
n = int(input())
A = [int(i) for i in input().split()]
#A = list(np.round(np.random.rand(n)*10,0))
count = mergeSort(A, 0, n)
print(*A)
print(count) INF = 10000000000 INF 10000000000 count = 0 count 0 def merge(A, left, mid, right):
    global count 
    L = A[left:mid] + [INF]
    R = A[mid:right] + [INF]
      
    i, j = 0, 0
    for k in range(left, right):
        count = count + 1
        if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1
    return count
   merge global count L = A[left:mid] + [INF] L A[left:mid] + [INF] A[left:mid] A left:mid left mid [INF] INF R = A[mid:right] + [INF] R A[mid:right] + [INF] A[mid:right] A mid:right mid right [INF] INF i, j = 0, 0 i 0 j 0 for k in range(left, right):
        count = count + 1
        if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1
     k range(left, right) range left right count = count + 1 count count + 1 count 1 if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1
     L[i] <= R[j] L[i] L i R[j] R j A[k] = L[i] A[k] A k L[i] L i i = i + 1 i i + 1 i 1 A[k] = R[j] A[k] A k R[j] R j j = j + 1 j j + 1 j 1 return count count A A left left mid mid right right def mergeSort(A, left, right):
    if left + 1 < right:
        mid = (left + right) // 2
        countL = mergeSort(A, left, mid)
        countR = mergeSort(A, mid, right)
        return merge(A, left, mid, right)
         
    return 0
          
   mergeSort if left + 1 < right:
        mid = (left + right) // 2
        countL = mergeSort(A, left, mid)
        countR = mergeSort(A, mid, right)
        return merge(A, left, mid, right)
         
     left + 1 < right left + 1 left 1 right mid = (left + right) // 2 mid (left + right) // 2 left + right left right 2 countL = mergeSort(A, left, mid) countL mergeSort(A, left, mid) mergeSort A left mid countR = mergeSort(A, mid, right) countR mergeSort(A, mid, right) mergeSort A mid right return merge(A, left, mid, right) merge(A, left, mid, right) merge A left mid right return 0 0 A A left left right right n = int(input()) n int(input()) int input() input int(i) for i in input().split() for i in input().split() i input().split() ().split () input split for i in input().split() int(i) int i A = [int(i) for i in input().split()] A [int(i) for i in input().split()] count = mergeSort(A, 0, n) count mergeSort(A, 0, n) mergeSort A 0 n print(*A) print *A A print(count) print count def merge(A, left, mid, right):
    global count 
    L = A[left:mid] + [INF]
    R = A[mid:right] + [INF]
      
    i, j = 0, 0
    for k in range(left, right):
        count = count + 1
        if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1
    return count
   def merge(A, left, mid, right):
    global count 
    L = A[left:mid] + [INF]
    R = A[mid:right] + [INF]
      
    i, j = 0, 0
    for k in range(left, right):
        count = count + 1
        if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1
    return count
   merge def mergeSort(A, left, right):
    if left + 1 < right:
        mid = (left + right) // 2
        countL = mergeSort(A, left, mid)
        countR = mergeSort(A, mid, right)
        return merge(A, left, mid, right)
         
    return 0
          
   def mergeSort(A, left, right):
    if left + 1 < right:
        mid = (left + right) // 2
        countL = mergeSort(A, left, mid)
        countR = mergeSort(A, mid, right)
        return merge(A, left, mid, right)
         
    return 0
          
   mergeSort n = int(input()) int(input()) n A = [int(i) for i in input().split()] [int(i) for i in input().split()] A count = 0 0 count count = mergeSort(A, 0, n) mergeSort(A, 0, n) count INF = 10000000000 10000000000 INF


INF = 10000000000
count = 0

def merge(A, left, mid, right):
    global count 
    L = A[left:mid] + [INF]
    R = A[mid:right] + [INF]
      
    i, j = 0, 0
    for k in range(left, right):
        count = count + 1
        if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1
    return count
  
def mergeSort(A, left, right):
    if left + 1 < right:
        mid = (left + right) // 2
        countL = mergeSort(A, left, mid)
        countR = mergeSort(A, mid, right)
        return merge(A, left, mid, right)
         
    return 0
          
  
n = int(input())
A = [int(i) for i in input().split()]
#A = list(np.round(np.random.rand(n)*10,0))
count = mergeSort(A, 0, n)
print(*A)
print(count)
