import re
import sys
INF=10000000000000
sys.setrecursionlimit(10**6)

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

def mergeSort(A,left,right):
    count=0
    if(left+1<right):
        mid=(left+right)//2
        count+=mergeSort(A, left, mid)
        count+=mergeSort(A, mid, right)
        count+=merge(A, left, mid, right)
    return count

count=0
n=int(input())
s=list(map(int,input().split()))
count=mergeSort(s, 0, n)

print(re.sub("[\[\]\,]","",str(s)))
print(count) import re re import sys sys INF=10000000000000 INF 10000000000000 sys.setrecursionlimit(10**6) sys.setrecursionlimit sys setrecursionlimit 10**6 10 6 def merge(A,left,mid,right):
    count=0
    L=A[left:mid]
    R=A[mid:right]
    L.append(INF)
    R.append(INF)
    i=0
    j=0
    for k in range(left,right):
        if(L[i] <= R[j]):
            A[k] = L[i]
            i+=1
            count+=1
        else:
            A[k] = R[j]
            j+=1
            count+=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(INF) L.append L append INF 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
            count+=1
        else:
            A[k] = R[j]
            j+=1
            count+=1
     k range(left,right) range left right if(L[i] <= R[j]):
            A[k] = L[i]
            i+=1
            count+=1
        else:
            A[k] = R[j]
            j+=1
            count+=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 count+=1 count 1 A[k] = R[j] A[k] A k R[j] R j j+=1 j 1 count+=1 count 1 return count count A A left left mid mid right right def mergeSort(A,left,right):
    count=0
    if(left+1<right):
        mid=(left+right)//2
        count+=mergeSort(A, left, mid)
        count+=mergeSort(A, mid, right)
        count+=merge(A, left, mid, right)
    return count mergeSort count=0 count 0 if(left+1<right):
        mid=(left+right)//2
        count+=mergeSort(A, left, mid)
        count+=mergeSort(A, mid, right)
        count+=merge(A, left, mid, right)
     left+1<right left+1 left 1 right mid=(left+right)//2 mid (left+right)//2 left+right left right 2 count+=mergeSort(A, left, mid) count mergeSort(A, left, mid) mergeSort A left mid count+=mergeSort(A, mid, right) count mergeSort(A, mid, right) mergeSort A mid right count+=merge(A, left, mid, right) count merge(A, left, mid, right) merge A left mid right return count count A A left left right right count=0 count 0 n=int(input()) n int(input()) int input() input s=list(map(int,input().split())) s list(map(int,input().split())) list map(int,input().split()) map int input().split() ().split () input split count=mergeSort(s, 0, n) count mergeSort(s, 0, n) mergeSort s 0 n print(re.sub("[\[\]\,]","",str(s))) print re.sub("[\[\]\,]","",str(s)) re.sub re sub "[\[\]\,]" "" str(s) str s print(count) print count def mergeSort(A,left,right):
    count=0
    if(left+1<right):
        mid=(left+right)//2
        count+=mergeSort(A, left, mid)
        count+=mergeSort(A, mid, right)
        count+=merge(A, left, mid, right)
    return count def mergeSort(A,left,right):
    count=0
    if(left+1<right):
        mid=(left+right)//2
        count+=mergeSort(A, left, mid)
        count+=mergeSort(A, mid, right)
        count+=merge(A, left, mid, right)
    return count mergeSort def merge(A,left,mid,right):
    count=0
    L=A[left:mid]
    R=A[mid:right]
    L.append(INF)
    R.append(INF)
    i=0
    j=0
    for k in range(left,right):
        if(L[i] <= R[j]):
            A[k] = L[i]
            i+=1
            count+=1
        else:
            A[k] = R[j]
            j+=1
            count+=1
    return count def merge(A,left,mid,right):
    count=0
    L=A[left:mid]
    R=A[mid:right]
    L.append(INF)
    R.append(INF)
    i=0
    j=0
    for k in range(left,right):
        if(L[i] <= R[j]):
            A[k] = L[i]
            i+=1
            count+=1
        else:
            A[k] = R[j]
            j+=1
            count+=1
    return count merge INF=10000000000000 10000000000000 INF s=list(map(int,input().split())) list(map(int,input().split())) s count=mergeSort(s, 0, n) mergeSort(s, 0, n) count count=0 0 count n=int(input()) int(input()) n
import re
import sys
INF=10000000000000
sys.setrecursionlimit(10**6)

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

def mergeSort(A,left,right):
    count=0
    if(left+1<right):
        mid=(left+right)//2
        count+=mergeSort(A, left, mid)
        count+=mergeSort(A, mid, right)
        count+=merge(A, left, mid, right)
    return count

count=0
n=int(input())
s=list(map(int,input().split()))
count=mergeSort(s, 0, n)

print(re.sub("[\[\]\,]","",str(s)))
print(count)
