INF = 10**9 + 1
cnt = 0


def merge(A, left, mid, right):
    global INF, cnt
    L = []
    R = []
    for i in range(left, mid):
        L.append(A[i])
    L.append(INF)
    for i in range(mid, right):
        R.append(A[i])
    R.append(INF)

    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
        cnt += 1


def merge_sort(A, left, right):
    # range: [left, right)
    if right - left <= 1:
        return
    mid = (left + right) / 2
    merge_sort(A, left, mid)
    merge_sort(A, mid, right)
    merge(A, left, mid, right)


if __name__ == '__main__':
    n = int(raw_input())
    A = map(int, raw_input().split())
    merge_sort(A, 0, n)
    for x in A:
        print x,
    print
    print cnt INF = 10**9 + 1 INF 10**9 + 1 10**9 10 9 1 cnt = 0 cnt 0 def merge(A, left, mid, right):
    global INF, cnt
    L = []
    R = []
    for i in range(left, mid):
        L.append(A[i])
    L.append(INF)
    for i in range(mid, right):
        R.append(A[i])
    R.append(INF)

    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
        cnt += 1 merge global INF, cnt L = [] L [] R = [] R [] for i in range(left, mid):
        L.append(A[i])
     i range(left, mid) range left mid L.append(A[i]) L.append L append A[i] A i L.append(INF) L.append L append INF for i in range(mid, right):
        R.append(A[i])
     i range(mid, right) range mid right R.append(A[i]) R.append R append A[i] A i R.append(INF) R.append R append INF i = 0 i 0 j = 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
        cnt += 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 cnt += 1 cnt 1 A A left left mid mid right right def merge_sort(A, left, right):
    # range: [left, right)
    if right - left <= 1:
        return
    mid = (left + right) / 2
    merge_sort(A, left, mid)
    merge_sort(A, mid, right)
    merge(A, left, mid, right) merge_sort if right - left <= 1:
        return
     right - left <= 1 right - left right left 1 return mid = (left + right) / 2 mid (left + right) / 2 left + right left right 2 merge_sort(A, left, mid) merge_sort A left mid merge_sort(A, mid, right) merge_sort A mid right merge(A, left, mid, right) merge A left mid right A A left left right right if __name__ == '__main__':
    n = int(raw_input())
    A = map(int, raw_input().split())
    merge_sort(A, 0, n)
    for x in A:
        print x,
    print
    print cnt __name__ == '__main__' __name__ '__main__' n = int(raw_input()) n int(raw_input()) int raw_input() raw_input A = map(int, raw_input().split()) A map(int, raw_input().split()) map int raw_input().split() ().split () raw_input split merge_sort(A, 0, n) merge_sort A 0 n for x in A:
        print x,
     x A print x print print INF = 10**9 + 1 10**9 + 1 INF def merge(A, left, mid, right):
    global INF, cnt
    L = []
    R = []
    for i in range(left, mid):
        L.append(A[i])
    L.append(INF)
    for i in range(mid, right):
        R.append(A[i])
    R.append(INF)

    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
        cnt += 1 def merge(A, left, mid, right):
    global INF, cnt
    L = []
    R = []
    for i in range(left, mid):
        L.append(A[i])
    L.append(INF)
    for i in range(mid, right):
        R.append(A[i])
    R.append(INF)

    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
        cnt += 1 merge n = int(raw_input()) int(raw_input()) n A = map(int, raw_input().split()) map(int, raw_input().split()) A def merge_sort(A, left, right):
    # range: [left, right)
    if right - left <= 1:
        return
    mid = (left + right) / 2
    merge_sort(A, left, mid)
    merge_sort(A, mid, right)
    merge(A, left, mid, right) def merge_sort(A, left, right):
    # range: [left, right)
    if right - left <= 1:
        return
    mid = (left + right) / 2
    merge_sort(A, left, mid)
    merge_sort(A, mid, right)
    merge(A, left, mid, right) merge_sort cnt = 0 0 cnt
INF = 10**9 + 1
cnt = 0


def merge(A, left, mid, right):
    global INF, cnt
    L = []
    R = []
    for i in range(left, mid):
        L.append(A[i])
    L.append(INF)
    for i in range(mid, right):
        R.append(A[i])
    R.append(INF)

    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
        cnt += 1


def merge_sort(A, left, right):
    # range: [left, right)
    if right - left <= 1:
        return
    mid = (left + right) / 2
    merge_sort(A, left, mid)
    merge_sort(A, mid, right)
    merge(A, left, mid, right)


if __name__ == '__main__':
    n = int(raw_input())
    A = map(int, raw_input().split())
    merge_sort(A, 0, n)
    for x in A:
        print x,
    print
    print cnt
