#include <iostream>
using namespace std;
const int N = 100010;
int Arr[N];
int Temp[N];
int nSum;
void Merge(int *p, int nLeft, int nMid, int nRight);
void MergeSort(int *p, int nLeft, int nRight);
int main(int argc, char** argv)
{
int nSize;
scanf("%d", &nSize);
for(int i = 0; i < nSize; i++)
{
scanf("%d", &Arr[i]);
}
MergeSort(Arr,0,nSize-1);
for(int i = 0; i < nSize; i++)
{
printf("%d ", Arr[i]);
}
printf("\n");
printf("%d\n",nSum);
return 0;
}
void Merge(int *p, int nLeft, int nMid,int nRight)
{
int l = nLeft; int r = nMid+1;
int nLen = 0;
while(l <= nMid && r <= nRight)
{
//nSum += Arr[l] >= Arr[r] ? (nRight-nMid) : 0;
Temp[nLen++] = Arr[l] <= Arr[r] ? Arr[l++] : Arr[r++];
}
while(l <= nMid)
{
Temp[nLen++] = Arr[l++];
}
while(r <= nRight)
{
Temp[nLen++] = Arr[r++];
}
for(int i = 0; i < nLen; i++)
{
Arr[i+nLeft] = Temp[i];
}
}
void MergeSort(int *p, int nLeft, int nRight)
{
if(nLeft >= nRight)
{
return;
}
int nMid = (nLeft+nRight)/2;
MergeSort(p, nLeft, nMid);
MergeSort(p, nMid+1, nRight);
Merge(p, nLeft, nMid, nRight);
}
12-22