INF = 10 ** 10


def merge(A, left, mid, right):
    count = 0
    L = A[left:mid] + [INF]
    R = A[mid:right] + [INF]

    i, j = 0, 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_sort(A, left, right):
    if left + 1 < right:
        mid = (left + right) // 2
        countL = merge_sort(A, left, mid)
        countR = merge_sort(A, mid, right)
        return merge(A, left, mid, right) + countL + countR
    return 0


N = int(input())
A = list(map(int, input().split()))
count = merge_sort(A, 0, N)
A = list(map(str, A))
print(' '.join(A))
print(count) INF = 10 ** 10 INF 10 ** 10 10 10 def merge(A, left, mid, right):
    count = 0
    L = A[left:mid] + [INF]
    R = A[mid:right] + [INF]

    i, j = 0, 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] + [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 += 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 merge_sort(A, left, right):
    if left + 1 < right:
        mid = (left + right) // 2
        countL = merge_sort(A, left, mid)
        countR = merge_sort(A, mid, right)
        return merge(A, left, mid, right) + countL + countR
    return 0 merge_sort if left + 1 < right:
        mid = (left + right) // 2
        countL = merge_sort(A, left, mid)
        countR = merge_sort(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 countL = merge_sort(A, left, mid) countL merge_sort(A, left, mid) merge_sort A left mid countR = merge_sort(A, mid, right) countR merge_sort(A, mid, right) merge_sort 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 = merge_sort(A, 0, N) count merge_sort(A, 0, N) merge_sort A 0 N A = list(map(str, A)) A list(map(str, A)) list map(str, A) map str A print(' '.join(A)) print ' '.join(A) ' '.join ' ' join A print(count) print count def merge(A, left, mid, right):
    count = 0
    L = A[left:mid] + [INF]
    R = A[mid:right] + [INF]

    i, j = 0, 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] + [INF]
    R = A[mid:right] + [INF]

    i, j = 0, 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 A = list(map(str, A)) list(map(str, A)) A N = int(input()) int(input()) N count = merge_sort(A, 0, N) merge_sort(A, 0, N) count INF = 10 ** 10 10 ** 10 INF def merge_sort(A, left, right):
    if left + 1 < right:
        mid = (left + right) // 2
        countL = merge_sort(A, left, mid)
        countR = merge_sort(A, mid, right)
        return merge(A, left, mid, right) + countL + countR
    return 0 def merge_sort(A, left, right):
    if left + 1 < right:
        mid = (left + right) // 2
        countL = merge_sort(A, left, mid)
        countR = merge_sort(A, mid, right)
        return merge(A, left, mid, right) + countL + countR
    return 0 merge_sort A = list(map(int, input().split())) list(map(int, input().split())) A
INF = 10 ** 10


def merge(A, left, mid, right):
    count = 0
    L = A[left:mid] + [INF]
    R = A[mid:right] + [INF]

    i, j = 0, 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_sort(A, left, right):
    if left + 1 < right:
        mid = (left + right) // 2
        countL = merge_sort(A, left, mid)
        countR = merge_sort(A, mid, right)
        return merge(A, left, mid, right) + countL + countR
    return 0


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