#前の問題で、戻り値とかIDとか変更したつもりのリストが変わっていないことが
#頻発していたはずだがとりあえず並び替え自体は終わる。countどうしようか。
#いじると並び替え前の配列が返ってくることがある。

n=int(input())
A1=input().split( )
A=[int(A1[i]) for i in range(n)]
###疑似コードのコピペ
def merge(A, left, mid, right):
    n1 = mid - left;
    n2 = right - mid;
#いちいち[0 for i...]を作るのやめた
    L=A[left:mid]+[10000000000]
    R=A[mid:right]+[10000000000]
    
    i = 0
    j = 0
    count=0

    for k in range(left,right):
        count+=1
        if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1

#count+=1の位置を変更,比較ってinfinityとの比較も含めるのか
#計算量的には当然か。
    return(count)

def mergeSort(A, left, right):
    count=0
    mid=0
    if left+1 < right:
        mid = int((left + right)/2)
#この辺で新しい変数をmergeSortの戻り値として定義
        countL=mergeSort(A, left, mid)
        countR=mergeSort(A, mid, right)
        countM=merge(A, left, mid, right)
        count=countL+countR+countM
    return(count)
c=mergeSort(A,0,n)
print(*A)
print(c)
 n=int(input()) n int(input()) int input() input A1=input().split( ) A1 input().split( ) ().split () input split int(A1[i]) for i in range(n) for i in range(n) i range(n) range n for i in range(n) int(A1[i]) int A1[i] A1 i A=[int(A1[i]) for i in range(n)] A [int(A1[i]) for i in range(n)] def merge(A, left, mid, right):
    n1 = mid - left;
    n2 = right - mid;
#いちいち[0 for i...]を作るのやめた
    L=A[left:mid]+[10000000000]
    R=A[mid:right]+[10000000000]
    
    i = 0
    j = 0
    count=0

    for k in range(left,right):
        count+=1
        if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1

#count+=1の位置を変更,比較ってinfinityとの比較も含めるのか
#計算量的には当然か。
    return(count) merge n1 = mid - left n1 mid - left mid left n2 = right - mid n2 right - mid right mid L=A[left:mid]+[10000000000] L A[left:mid]+[10000000000] A[left:mid] A left:mid left mid [10000000000] 10000000000 R=A[mid:right]+[10000000000] R A[mid:right]+[10000000000] A[mid:right] A mid:right mid right [10000000000] 10000000000 i = 0 i 0 j = 0 j 0 count=0 count 0 for k in range(left,right):
        count+=1
        if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1

#count+=1の位置を変更,比較ってinfinityとの比較も含めるのか
#計算量的には当然か。
     k range(left,right) range left right count+=1 count 1 if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1

#count+=1の位置を変更,比較ってinfinityとの比較も含めるのか
#計算量的には当然か。
     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 = i + 1 i i + 1 i 1 A[k] = R[j] A[k] A k R[j] R j j = j + 1 j j + 1 j 1 return(count) count A A left left mid mid right right def mergeSort(A, left, right):
    count=0
    mid=0
    if left+1 < right:
        mid = int((left + right)/2)
#この辺で新しい変数をmergeSortの戻り値として定義
        countL=mergeSort(A, left, mid)
        countR=mergeSort(A, mid, right)
        countM=merge(A, left, mid, right)
        count=countL+countR+countM
    return(count) mergeSort count=0 count 0 mid=0 mid 0 if left+1 < right:
        mid = int((left + right)/2)
#この辺で新しい変数をmergeSortの戻り値として定義
        countL=mergeSort(A, left, mid)
        countR=mergeSort(A, mid, right)
        countM=merge(A, left, mid, right)
        count=countL+countR+countM
     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 countM=merge(A, left, mid, right) countM merge(A, left, mid, right) merge A left mid right count=countL+countR+countM count countL+countR+countM countL+countR countL countR countM return(count) count A A left left right right c=mergeSort(A,0,n) c mergeSort(A,0,n) mergeSort A 0 n print(*A) print *A A print(c) print c def mergeSort(A, left, right):
    count=0
    mid=0
    if left+1 < right:
        mid = int((left + right)/2)
#この辺で新しい変数をmergeSortの戻り値として定義
        countL=mergeSort(A, left, mid)
        countR=mergeSort(A, mid, right)
        countM=merge(A, left, mid, right)
        count=countL+countR+countM
    return(count) def mergeSort(A, left, right):
    count=0
    mid=0
    if left+1 < right:
        mid = int((left + right)/2)
#この辺で新しい変数をmergeSortの戻り値として定義
        countL=mergeSort(A, left, mid)
        countR=mergeSort(A, mid, right)
        countM=merge(A, left, mid, right)
        count=countL+countR+countM
    return(count) mergeSort n=int(input()) int(input()) n A=[int(A1[i]) for i in range(n)] [int(A1[i]) for i in range(n)] A def merge(A, left, mid, right):
    n1 = mid - left;
    n2 = right - mid;
#いちいち[0 for i...]を作るのやめた
    L=A[left:mid]+[10000000000]
    R=A[mid:right]+[10000000000]
    
    i = 0
    j = 0
    count=0

    for k in range(left,right):
        count+=1
        if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1

#count+=1の位置を変更,比較ってinfinityとの比較も含めるのか
#計算量的には当然か。
    return(count) def merge(A, left, mid, right):
    n1 = mid - left;
    n2 = right - mid;
#いちいち[0 for i...]を作るのやめた
    L=A[left:mid]+[10000000000]
    R=A[mid:right]+[10000000000]
    
    i = 0
    j = 0
    count=0

    for k in range(left,right):
        count+=1
        if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1

#count+=1の位置を変更,比較ってinfinityとの比較も含めるのか
#計算量的には当然か。
    return(count) merge c=mergeSort(A,0,n) mergeSort(A,0,n) c A1=input().split( ) input().split( ) A1
#前の問題で、戻り値とかIDとか変更したつもりのリストが変わっていないことが
#頻発していたはずだがとりあえず並び替え自体は終わる。countどうしようか。
#いじると並び替え前の配列が返ってくることがある。

n=int(input())
A1=input().split( )
A=[int(A1[i]) for i in range(n)]
###疑似コードのコピペ
def merge(A, left, mid, right):
    n1 = mid - left;
    n2 = right - mid;
#いちいち[0 for i...]を作るのやめた
    L=A[left:mid]+[10000000000]
    R=A[mid:right]+[10000000000]
    
    i = 0
    j = 0
    count=0

    for k in range(left,right):
        count+=1
        if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1

#count+=1の位置を変更,比較ってinfinityとの比較も含めるのか
#計算量的には当然か。
    return(count)

def mergeSort(A, left, right):
    count=0
    mid=0
    if left+1 < right:
        mid = int((left + right)/2)
#この辺で新しい変数をmergeSortの戻り値として定義
        countL=mergeSort(A, left, mid)
        countR=mergeSort(A, mid, right)
        countM=merge(A, left, mid, right)
        count=countL+countR+countM
    return(count)
c=mergeSort(A,0,n)
print(*A)
print(c)

