#include<bits/stdc++.h>
#define ls o<<1
#define rs o<<1|1
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
typedef long long LL;
template<class T> inline void gmax(T &a,T b){if(b>a)a=b;}
template<class T> inline void gmin(T &a,T b){if(b<a)a=b;}
const int N=1e5+10,M=0,Z=1e9+7,W=13,L=2e6;
const double eps=1e-10;
const int dy[4]={-1,0,0,1},dx[4]={0,-1,1,0};
using namespace std;
int casenum,casei;
int id;
int n,m,nn;
//int a[N];
struct AA{
int idx;
LL val;
}a[N];
LL cnt[N];
bool cmp(AA a, AA b){
return a.val<b.val;
}
//make sure two sides are sorted
void solve(int l,int mid,int r){
int i=l,j=mid+1;
// printf("%d%d%d",l,mid,r);
while(i<=mid&&j<=r){
if(a[i].val<=a[j].val){
i++;
}else{
cnt[a[j].idx]+=(LL)(mid+1-i);
j++;
}
}
i=mid;j=r;
while(i>=l&&j>=mid+1){
if(a[i].val<=a[j].val){
j--;
}else{
cnt[a[i].idx]+=(LL)(j-mid);
i--;
}
}
sort(a+l,a+r+1,cmp);
return ;
}
void ddd(int l,int r){
if(l>=r)return;
int mid=(l+r)>>1;
// printf("%d%d\n",l,r);
ddd(l,mid);
ddd(mid+1,r);
solve(l,mid,r);
}
int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
// MS(cnt,0);
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lld",&a[i].val);
a[i].idx=i;
}
ddd(0,n-1);
LL ans=0;
for(int i=0;i<n;i++){
ans+=(cnt[i]+1)*(cnt[i])/2;
}
printf("%lld\n",ans);
return 0;
}
文言ビットは、時間に追わ
各パスを超える注文されることに注意してください