#include<stdio.h>
#define MAXN 10000
int arr[MAXN],temp[MAXN];
int ans;
void merge(int head,int mid,int end){//排序并归并
int i=head,j=mid+1,k=0;
while(i <= mid && j <= end){
if(arr[i] <= arr[j])
temp[k++]=arr[i++];
else{
ans += mid - i + 1;//求逆序数
temp[k++]=arr[j++];
}
}
while(i <= mid)//将还未进入的数输进去
temp[k++]=arr[i++];
while(j <= end)
temp[k++]=arr[j++];
for(i=0 ; i<k ; i++)//将合并后的序列赋给原来的序列arr
arr[head+i]=temp[i];
}
void resolve(int head,int end){//分解
if(head<end){
int mid=(head+end)/2;
resolve(head,mid);//左子序列排序
resolve(mid+1,end);//右子序列排序
merge(head,mid,end);//合并子序列
}
}//稳定排序,及相同的数先出现的在前面
int main()
{
int n;
while(~scanf("%d",&n))
{
ans=0;
for(int i=0 ; i<n ; i++)
scanf("%d",&arr[i]);
resolve(0,n-1);
for(int i=0 ; i<n ; i++)
printf("%d ",arr[i]);
printf("\n");
printf("%d\n",ans);
}
return 0;
}