#include"stdio.h"
#include"iostream"
using namespace std;
#define maxn 1000000
__int64 t[maxn],a[maxn];
__int64 Count;
void sort(int x,int y)
{
if(y-x>1)
{
int m=x+(y-x)/2;
int p=x,q=m,i=x;
sort(x,m);sort(m,y);
while(p<m||q<y)
{
if(q>=y||(p<m&&a[p]<=a[q])) //改变 a[p1] 和 a[p2] 之间的符号改变排序的规则
t[i++]=a[p++];
else
{
Count+=q-i; //记录归并排序移动的最小次数
t[i++]=a[q++];
//Count+=(m-p); //记录逆序对
}
}
for(int i=x;i<y;i++) a[i]=t[i];
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
Count =0;
for(int i=0;i<n;i++)
scanf("%I64d",a+i);
sort(0,n);
printf("%I64d\n",Count);
}
return 0;
}
#include <iostream>
#include"vector"
#include "stdio.h"
#include"algorithm"
#define fuck(ex) printf(#ex"=%d\n",ex)
#define pf(xs,rx) printf(#xs"sdfsdf"#xs"\n",rx,xs);
#define max(a,b) (a)>(b)?(a):(b);
#define all(a) (a).begin(),(a).end()
#define sf(a) scanf("%d",&a)
#define Swap(t,x,y) {t _z=x;x=y;y=_z;}
using namespace std;
#define LL rt<<1
#define RR rt<<1|1
#define lson l,m,LL
#define rson m+1,r,RR
#define bug puts("bugbug");
const int maxn = 11111;
const int INF=9999999;
int Left[1000],Right[1000];
int a[1000];
void merge(int l,int m,int r)
{
int i,j,k;
int n1=m-l+1;
int n2=r-m;
for(i=1;i<=n1;i++)
Left[i]=a[l+i-1];
for(i=1;i<=n2;i++)
Right[i]=a[m+1+i-1];
Left[n1+1]=Right[n2+1]=INF;
i=j=1;
for(k=l;k<=r;k++)
{
if(Right[i]<=Left[j]) a[k]=Right[i++];
else a[k]=Left[j++];
}
}
void merge_sort(int l,int r) //递归的意思: 自己调用自己,不要往深处想,递归这种事情人能全部模拟,要电脑干嘛
{
if(r>l) //边界设定好大于2的时候才进行 分成左右两队进行排序
{
int m=(l+r)/2;
merge_sort(l,m); //2.给左半部分排序
merge_sort(m+1,r); //3.给右半部分排序
merge(l,m,r); //4.合并:电脑通过递归帮你左右分成两队排序之后是两个有序序列,
//但整个序列并没有排好序,这一步就是最关键的合并
}
}
int main()
{
while(1)
{
int n;cin>>n;
int i;for(i=1;i<=n;i++)cin>>a[i];
merge_sort(1,n); //1.给1-n排序
for(i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
}
return 0;
}