#include <iostream>
#include <vector>
#define ai_jiang signed main()
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define drep(a,b,c) for(int a=b;a>=c;a--)
#define all(a) a.begin(),a.end()
#define ll long long
using namespace std;
using poly=vector<ll>;
namespace ai {
constexpr int N = 1e5+5;
int n,a[N],b[N];
ll ans;
struct segment_tree {
struct node { int l,r,sum,w; } tr[N<<2];
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
void pushup(int x) { tr[x].sum=tr[lc(x)].sum+tr[rc(x)].sum; tr[x].w=tr[lc(x)].w+tr[rc(x)].w; }
void build(int p,int l,int r) {
tr[p]={l,r,0,0};
if(l==r) return;
int mid=l+r>>1;
build(lc(p),l,mid); build(rc(p),mid+1,r);
pushup(p);
}
void modify(int p,int pos,int v) {
if(tr[p].l==tr[p].r) return void(tr[p].sum+=v);
int mid=tr[p].l+tr[p].r>>1;
if(pos<=mid) modify(lc(p),pos,v);
else modify(rc(p),pos,v);
pushup(p);
}
void mf2(int p,int pos,int v) {
if(tr[p].l==tr[p].r) return void(tr[p].w+=v);
int mid=tr[p].l+tr[p].r>>1;
if(pos<=mid) mf2(lc(p),pos,v);
else mf2(rc(p),pos,v);
pushup(p);
}
int qry(int p,int l,int r) {
if(l<=tr[p].l&&tr[p].r<=r) return tr[p].sum;
int mid=tr[p].l+tr[p].r>>1,ans=0;
if(l<=mid) ans+=qry(lc(p),l,r);
if(r>mid) ans+=qry(rc(p),l,r);
return ans;
}
int qry2(int p,int l,int r) {
if(l<=tr[p].l&&tr[p].r<=r) return tr[p].w;
int mid=tr[p].l+tr[p].r>>1,ans=0;
if(l<=mid) ans+=qry2(lc(p),l,r);
if(r>mid) ans+=qry2(rc(p),l,r);
return ans;
}
} vsgt;
}
using namespace ai;
ai_jiang {
cin.tie(0); cout.tie(0);
cin>>n;
rep(i,1,n)
cin>>a[i];
vsgt.build(1,1,100000);
rep(i,1,n) {
if(a[i]>1) b[i]=vsgt.qry(1,1,a[i]-1);
vsgt.modify(1,a[i],1);
}
rep(i,1,n) vsgt.mf2(1,a[i],b[i]);
rep(i,3,n)
ans+=vsgt.qry2(1,1,a[i]-1);
cout<<ans;
return 0;
}