# -*- coding: utf-8 -*-

"""
マージソート
・再帰で全部分割してから統合
"""

import sys
def input(): return sys.stdin.readline().strip()

N = int(input())
aN = list(map(int, input().split()))
ans = 0

def merge(l, m, r):
    # 比較回数
    global ans    

    # aNからl～mとm～rの範囲を取り出す
    L = aN[l:m]
    R = aN[m:r]
    # 番兵(最後の要素の処理をしやすくする)
    L.append(float('inf'))
    R.append(float('inf'))

    i = j = 0
    # 前から順番にLとRを比べて、
    # 小さい方からaNに更新かけて添字を進める
    for k in range(l, r):
        if L[i] <= R[j]:
            aN[k] = L[i]
            i += 1
        else:
            aN[k] = R[j]
            j += 1
        ans += 1

def merge_sort(l, r):
    # l==rの時は何もしない
    if l+1 < r:
        # l==r(要素が1つ)になるまで再帰処理で分割する
        m = (l+r) // 2
        merge_sort(l, m)
        merge_sort(m, r)
        # 統合していく
        merge(l, m, r)

merge_sort(0, N)
print(*aN)
print(ans)
 """
マージソート
・再帰で全部分割してから統合
""" import sys sys def input(): return sys.stdin.readline().strip() input N = int(input()) N int(input()) int input() input aN = list(map(int, input().split())) aN list(map(int, input().split())) list map(int, input().split()) map int input().split() ().split () input split ans = 0 ans 0 def merge(l, m, r):
    # 比較回数
    global ans    

    # aNからl～mとm～rの範囲を取り出す
    L = aN[l:m]
    R = aN[m:r]
    # 番兵(最後の要素の処理をしやすくする)
    L.append(float('inf'))
    R.append(float('inf'))

    i = j = 0
    # 前から順番にLとRを比べて、
    # 小さい方からaNに更新かけて添字を進める
    for k in range(l, r):
        if L[i] <= R[j]:
            aN[k] = L[i]
            i += 1
        else:
            aN[k] = R[j]
            j += 1
        ans += 1 merge global ans L = aN[l:m] L aN[l:m] aN l:m l m R = aN[m:r] R aN[m:r] aN m:r m r 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 = j = 0 i 0 = j = 0 j 0 for k in range(l, r):
        if L[i] <= R[j]:
            aN[k] = L[i]
            i += 1
        else:
            aN[k] = R[j]
            j += 1
        ans += 1 k range(l, r) range l r if L[i] <= R[j]:
            aN[k] = L[i]
            i += 1
        else:
            aN[k] = R[j]
            j += 1
         L[i] <= R[j] L[i] L i R[j] R j aN[k] = L[i] aN[k] aN k L[i] L i i += 1 i 1 aN[k] = R[j] aN[k] aN k R[j] R j j += 1 j 1 ans += 1 ans 1 l l m m r r def merge_sort(l, r):
    # l==rの時は何もしない
    if l+1 < r:
        # l==r(要素が1つ)になるまで再帰処理で分割する
        m = (l+r) // 2
        merge_sort(l, m)
        merge_sort(m, r)
        # 統合していく
        merge(l, m, r) merge_sort if l+1 < r:
        # l==r(要素が1つ)になるまで再帰処理で分割する
        m = (l+r) // 2
        merge_sort(l, m)
        merge_sort(m, r)
        # 統合していく
        merge(l, m, r) l+1 < r l+1 l 1 r m = (l+r) // 2 m (l+r) // 2 l+r l r 2 merge_sort(l, m) merge_sort l m merge_sort(m, r) merge_sort m r merge(l, m, r) merge l m r l l r r merge_sort(0, N) merge_sort 0 N print(*aN) print *aN aN print(ans) print ans ans = 0 0 ans N = int(input()) int(input()) N def merge(l, m, r):
    # 比較回数
    global ans    

    # aNからl～mとm～rの範囲を取り出す
    L = aN[l:m]
    R = aN[m:r]
    # 番兵(最後の要素の処理をしやすくする)
    L.append(float('inf'))
    R.append(float('inf'))

    i = j = 0
    # 前から順番にLとRを比べて、
    # 小さい方からaNに更新かけて添字を進める
    for k in range(l, r):
        if L[i] <= R[j]:
            aN[k] = L[i]
            i += 1
        else:
            aN[k] = R[j]
            j += 1
        ans += 1 def merge(l, m, r):
    # 比較回数
    global ans    

    # aNからl～mとm～rの範囲を取り出す
    L = aN[l:m]
    R = aN[m:r]
    # 番兵(最後の要素の処理をしやすくする)
    L.append(float('inf'))
    R.append(float('inf'))

    i = j = 0
    # 前から順番にLとRを比べて、
    # 小さい方からaNに更新かけて添字を進める
    for k in range(l, r):
        if L[i] <= R[j]:
            aN[k] = L[i]
            i += 1
        else:
            aN[k] = R[j]
            j += 1
        ans += 1 merge aN = list(map(int, input().split())) list(map(int, input().split())) aN def input(): return sys.stdin.readline().strip() def input(): return sys.stdin.readline().strip() input def merge_sort(l, r):
    # l==rの時は何もしない
    if l+1 < r:
        # l==r(要素が1つ)になるまで再帰処理で分割する
        m = (l+r) // 2
        merge_sort(l, m)
        merge_sort(m, r)
        # 統合していく
        merge(l, m, r) def merge_sort(l, r):
    # l==rの時は何もしない
    if l+1 < r:
        # l==r(要素が1つ)になるまで再帰処理で分割する
        m = (l+r) // 2
        merge_sort(l, m)
        merge_sort(m, r)
        # 統合していく
        merge(l, m, r) merge_sort
# -*- coding: utf-8 -*-

"""
マージソート
・再帰で全部分割してから統合
"""

import sys
def input(): return sys.stdin.readline().strip()

N = int(input())
aN = list(map(int, input().split()))
ans = 0

def merge(l, m, r):
    # 比較回数
    global ans    

    # aNからl～mとm～rの範囲を取り出す
    L = aN[l:m]
    R = aN[m:r]
    # 番兵(最後の要素の処理をしやすくする)
    L.append(float('inf'))
    R.append(float('inf'))

    i = j = 0
    # 前から順番にLとRを比べて、
    # 小さい方からaNに更新かけて添字を進める
    for k in range(l, r):
        if L[i] <= R[j]:
            aN[k] = L[i]
            i += 1
        else:
            aN[k] = R[j]
            j += 1
        ans += 1

def merge_sort(l, r):
    # l==rの時は何もしない
    if l+1 < r:
        # l==r(要素が1つ)になるまで再帰処理で分割する
        m = (l+r) // 2
        merge_sort(l, m)
        merge_sort(m, r)
        # 統合していく
        merge(l, m, r)

merge_sort(0, N)
print(*aN)
print(ans)

