using namespace std;
const int N = 1e5 + 10;
int q[N], n;
int t[N];
long long res = 0;
void merge_sort(int q[], int l, int r) {
if(l >= r) return ;
int mid = l + r >> 1;
merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
int i = l, j = mid + 1, g = 0;
while(i <= mid && j <= r) {
/*
思考方向:
1.以q[i]为标准去看[mid + 1, r]中比q[i]小的数的个数
此时必然是q[i] > q[j]才会思考这个问题,显然的是[mid + 1, j]比q[i]小,
那么从q[i]角度去计算[mid + 1, r]中比q[i]小的数的个数,可能会出现重复,
因为此时[mid + 1, r]中比q[i]小的数的分界并不明显,可能q[j + 1], q[j + 2], ... 等都会比q[i]小,
这时候如果一直到找到一个大于等于q[j]的q[i],需要进行边界以及大小的再次判断,太过麻烦
2.还是以q[j]为标准去看[l, mid]中比q[j]大的数的个数
此时q[j] < q[i],那么说明[i, mid]都是比q[j]大的,
且[l, i - 1]都是比q[j]小的,否则不会有q[i]和q[j]的比较
*/
if(q[i] <= q[j]) t[++g] = q[i++];
else {
res += mid - i + 1;
t[++g] = q[j++];
}
}
while(i <= mid) t[++g] = q[i++];
while(j <= r) t[++g] = q[j++];
for(int i = l, j = 1; j <= g; i++, j++) q[i] = t[j];
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &q[i]);
merge_sort(q, 1, n);
printf("%lld\n", res);
return 0;
}