INF = 10000000000

n = int(input())
A = [int(x) for x in input().split()]

def merge(A,left,mid,right):
    count = 0
    n1 = mid - left
    n2 = right - mid
    L = A[left:mid] + [INF]
    R = A[mid:right] + [INF]
    #L,Rの中身はAの中身の部分コピーだからいちいちappendするより
    #スライスしてまとめてコピーしたほうが処理が軽い
    #[INF]は番兵みたいなもの
    #[INF]を追加しておくとL,Rを調べつくしての
    #list index out of rangeを回避できる
    i, j = 0, 0
    for k in range(left, right):
        if L[i] <= R[j]:
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[j]
            j += 1
    count += right - left
    return count

def mergeSort(A,left,right):
    if left + 1 < right:
        mid = int((left + right) / 2)
        countL = mergeSort(A,left,mid)
        countR = mergeSort(A,mid,right)
        return merge(A,left,mid,right) + countL + countR
    return 0

count = mergeSort(A,0,n)
for i in range(n):
    if i:
        print(" ",end="")
    print(A[i],end="")
print()
print(count)
 INF = 10000000000 INF 10000000000 n = int(input()) n int(input()) int input() input int(x) for x in input().split() for x in input().split() x input().split() ().split () input split for x in input().split() int(x) int x A = [int(x) for x in input().split()] A [int(x) for x in input().split()] def merge(A,left,mid,right):
    count = 0
    n1 = mid - left
    n2 = right - mid
    L = A[left:mid] + [INF]
    R = A[mid:right] + [INF]
    #L,Rの中身はAの中身の部分コピーだからいちいちappendするより
    #スライスしてまとめてコピーしたほうが処理が軽い
    #[INF]は番兵みたいなもの
    #[INF]を追加しておくとL,Rを調べつくしての
    #list index out of rangeを回避できる
    i, j = 0, 0
    for k in range(left, right):
        if L[i] <= R[j]:
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[j]
            j += 1
    count += right - left
    return count merge count = 0 count 0 n1 = mid - left n1 mid - left mid left n2 = right - mid n2 right - mid right mid 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):
        if L[i] <= R[j]:
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[j]
            j += 1
     k range(left, right) range left right if L[i] <= R[j]:
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[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 += 1 i 1 A[k] = R[j] A[k] A k R[j] R j j += 1 j 1 count += right - left count right - left right left return count count A A left left mid mid right right def mergeSort(A,left,right):
    if left + 1 < right:
        mid = int((left + right) / 2)
        countL = mergeSort(A,left,mid)
        countR = mergeSort(A,mid,right)
        return merge(A,left,mid,right) + countL + countR
    return 0 mergeSort if left + 1 < right:
        mid = int((left + right) / 2)
        countL = mergeSort(A,left,mid)
        countR = mergeSort(A,mid,right)
        return merge(A,left,mid,right) + countL + countR
     left + 1 < right left + 1 left 1 right mid = int((left + right) / 2) mid int((left + right) / 2) int (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) + countL + countR merge(A,left,mid,right) + countL + countR merge(A,left,mid,right) + countL merge(A,left,mid,right) merge A left mid right countL countR return 0 0 A A left left right right count = mergeSort(A,0,n) count mergeSort(A,0,n) mergeSort A 0 n for i in range(n):
    if i:
        print(" ",end="")
    print(A[i],end="") i range(n) range n if i:
        print(" ",end="")
     i print(" ",end="") print " " end="" end "" print(A[i],end="") print A[i] A i end="" end "" print() print print(count) print count n = int(input()) int(input()) n count = mergeSort(A,0,n) mergeSort(A,0,n) count def mergeSort(A,left,right):
    if left + 1 < right:
        mid = int((left + right) / 2)
        countL = mergeSort(A,left,mid)
        countR = mergeSort(A,mid,right)
        return merge(A,left,mid,right) + countL + countR
    return 0 def mergeSort(A,left,right):
    if left + 1 < right:
        mid = int((left + right) / 2)
        countL = mergeSort(A,left,mid)
        countR = mergeSort(A,mid,right)
        return merge(A,left,mid,right) + countL + countR
    return 0 mergeSort A = [int(x) for x in input().split()] [int(x) for x in input().split()] A INF = 10000000000 10000000000 INF def merge(A,left,mid,right):
    count = 0
    n1 = mid - left
    n2 = right - mid
    L = A[left:mid] + [INF]
    R = A[mid:right] + [INF]
    #L,Rの中身はAの中身の部分コピーだからいちいちappendするより
    #スライスしてまとめてコピーしたほうが処理が軽い
    #[INF]は番兵みたいなもの
    #[INF]を追加しておくとL,Rを調べつくしての
    #list index out of rangeを回避できる
    i, j = 0, 0
    for k in range(left, right):
        if L[i] <= R[j]:
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[j]
            j += 1
    count += right - left
    return count def merge(A,left,mid,right):
    count = 0
    n1 = mid - left
    n2 = right - mid
    L = A[left:mid] + [INF]
    R = A[mid:right] + [INF]
    #L,Rの中身はAの中身の部分コピーだからいちいちappendするより
    #スライスしてまとめてコピーしたほうが処理が軽い
    #[INF]は番兵みたいなもの
    #[INF]を追加しておくとL,Rを調べつくしての
    #list index out of rangeを回避できる
    i, j = 0, 0
    for k in range(left, right):
        if L[i] <= R[j]:
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[j]
            j += 1
    count += right - left
    return count merge
INF = 10000000000

n = int(input())
A = [int(x) for x in input().split()]

def merge(A,left,mid,right):
    count = 0
    n1 = mid - left
    n2 = right - mid
    L = A[left:mid] + [INF]
    R = A[mid:right] + [INF]
    #L,Rの中身はAの中身の部分コピーだからいちいちappendするより
    #スライスしてまとめてコピーしたほうが処理が軽い
    #[INF]は番兵みたいなもの
    #[INF]を追加しておくとL,Rを調べつくしての
    #list index out of rangeを回避できる
    i, j = 0, 0
    for k in range(left, right):
        if L[i] <= R[j]:
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[j]
            j += 1
    count += right - left
    return count

def mergeSort(A,left,right):
    if left + 1 < right:
        mid = int((left + right) / 2)
        countL = mergeSort(A,left,mid)
        countR = mergeSort(A,mid,right)
        return merge(A,left,mid,right) + countL + countR
    return 0

count = mergeSort(A,0,n)
for i in range(n):
    if i:
        print(" ",end="")
    print(A[i],end="")
print()
print(count)

