#include<bits/stdc++.h>
#define int long long
#define end '\n'
#define lowbit(x) x & -x
using namespace std;
const int N = 2e4 + 5;
int t;
int n;
int l1[N], u2[N];
struct Node{
int x, id;
}a[N];
struct BIT{
int tree[N];
void init(){
memset(tree, 0, sizeof(tree));
}
void update(int x, int val){
while(x <= n){
tree[x] += val;
x += lowbit(x);
}
}
int query(int x){
int sum = 0;
while(x){
sum += tree[x];
x -= lowbit(x);
}
return sum;
}
}TR;
int l_xt[N], r_xt[N];
map<int, int> mp;
void Solve(){
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i].x;
a[i].id = i;
}
for(int i = 1; i <= n; i++){
l_xt[i] = mp[a[i].x];
mp[a[i].x]++;
}
mp.clear();
for(int i = n; i >= 1; i--){
r_xt[i] = mp[a[i].x];
mp[a[i].x]++;
}
sort(a + 1, a + 1 + n, [](Node x, Node y){return x.x > y.x;});
for(int i = 1; i <= n; i++){
u2[a[i].id] = TR.query(n) - TR.query(a[i].id - 1) - r_xt[a[i].id];
TR.update(a[i].id, 1);
}
TR.init();
sort(a + 1, a + 1 + n, [](Node x, Node y){return x.x < y.x;});
for(int i = 1; i <= n; i++){
l1[a[i].id] = TR.query(a[i].id) - l_xt[a[i].id];
TR.update(a[i].id, 1);
}
int sum = 0;
for(int i = 1; i <= n; i++){
sum += l1[a[i].id] * u2[a[i].id];
}
cout << sum << endl;
}
signed main(){
Solve();
return 0;
}