#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#define int long long
using namespace std;
const int N = 3e4 + 10;
int n, a[N], a1[N];
int tr1[N], tr2[N], up[N], down[N];
int m;
int lowbit(int x)
{
return x & -x;
}
void modify(int *tr, int x, int v)
{
for (int i = x; i <= N; i += lowbit(i))
tr[i] += v;
}
int query(int *tr, int r)
{
int res = 0;
for (int i = r; i; i -= lowbit(i))
res += tr[i];
return res;
}
int find(int val)
{
return lower_bound(a1 + 1, a1 + m + 1, val) - a1;
}
signed main()
{
cin >> n;
for (int i = 1; i <= n; i ++ )
cin >> a[i], a1[i] = a[i];
sort(a1 + 1, a1 + n + 1);
m = unique(a1 + 1, a1 + n + 1) - (a1 + 1);
for (int i = 1; i <= n; i ++ )
{
auto &y = a[i];
modify(tr1, find(y), 1);
down[i] = query(tr1, find(y) - 1);
}
for (int i = n; i; i -- )
{
auto &y = a[i];
modify(tr2, find(y), 1);
up[i] = n - i - query(tr2, find(y) - 1);
}
int res = 0;
for (int i = 2; i < n; i ++ )
res += down[i] * up[i];
cout << res << endl;
return 0;
}