def merge(A, left, mid, right):
    count =0
    L = A[left:mid]
    R = A[mid:right]
    L.append(float('inf'))
    R.append(float('inf'))
    i = 0
    j = 0
    for k in range(left, right):
        count +=1
        if L[i] <= R[j]:
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[j]
            j += 1
    return count

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

N = int(input())
A = list(map(int, input().split()))
count = MergeSort(A, 0, N)
print(" ".join(list(map(str, A))))
print(count) def merge(A, left, mid, right):
    count =0
    L = A[left:mid]
    R = A[mid:right]
    L.append(float('inf'))
    R.append(float('inf'))
    i = 0
    j = 0
    for k in range(left, right):
        count +=1
        if L[i] <= R[j]:
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[j]
            j += 1
    return count merge count =0 count 0 L = A[left:mid] L A[left:mid] A left:mid left mid R = A[mid:right] R A[mid:right] A mid:right mid right L.append(float('inf')) L.append L append float('inf') float 'inf' R.append(float('inf')) R.append R append float('inf') float 'inf' i = 0 i 0 j = 0 j 0 for k in range(left, right):
        count +=1
        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 count +=1 count 1 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 return count count A A left left mid mid right right def MergeSort(A, left, right):
    if left +1 < right:
        mid = (left + right)//2
        countR = MergeSort(A, left, mid)
        countL = MergeSort(A, mid, right)
        return merge(A, left, mid, right) + countL + countR
    return 0 MergeSort if left +1 < right:
        mid = (left + right)//2
        countR = MergeSort(A, left, mid)
        countL = MergeSort(A, mid, right)
        return merge(A, left, mid, right) + countL + countR
     left +1 < right left +1 left 1 right mid = (left + right)//2 mid (left + right)//2 left + right left right 2 countR = MergeSort(A, left, mid) countR MergeSort(A, left, mid) MergeSort A left mid countL = MergeSort(A, mid, right) countL 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 N = int(input()) N int(input()) int input() input A = list(map(int, input().split())) A list(map(int, input().split())) list map(int, input().split()) map int input().split() ().split () input split count = MergeSort(A, 0, N) count MergeSort(A, 0, N) MergeSort A 0 N print(" ".join(list(map(str, A)))) print " ".join(list(map(str, A))) " ".join " " join list(map(str, A)) list map(str, A) map str A print(count) print count A = list(map(int, input().split())) list(map(int, input().split())) A def merge(A, left, mid, right):
    count =0
    L = A[left:mid]
    R = A[mid:right]
    L.append(float('inf'))
    R.append(float('inf'))
    i = 0
    j = 0
    for k in range(left, right):
        count +=1
        if L[i] <= R[j]:
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[j]
            j += 1
    return count def merge(A, left, mid, right):
    count =0
    L = A[left:mid]
    R = A[mid:right]
    L.append(float('inf'))
    R.append(float('inf'))
    i = 0
    j = 0
    for k in range(left, right):
        count +=1
        if L[i] <= R[j]:
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[j]
            j += 1
    return count merge 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 = (left + right)//2
        countR = MergeSort(A, left, mid)
        countL = MergeSort(A, mid, right)
        return merge(A, left, mid, right) + countL + countR
    return 0 def MergeSort(A, left, right):
    if left +1 < right:
        mid = (left + right)//2
        countR = MergeSort(A, left, mid)
        countL = MergeSort(A, mid, right)
        return merge(A, left, mid, right) + countL + countR
    return 0 MergeSort
def merge(A, left, mid, right):
    count =0
    L = A[left:mid]
    R = A[mid:right]
    L.append(float('inf'))
    R.append(float('inf'))
    i = 0
    j = 0
    for k in range(left, right):
        count +=1
        if L[i] <= R[j]:
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[j]
            j += 1
    return count

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

N = int(input())
A = list(map(int, input().split()))
count = MergeSort(A, 0, N)
print(" ".join(list(map(str, A))))
print(count)
