转自:https://blog.csdn.net/bxg1065283526/article/details/79682798
#include <bits/stdc++.h>
using namespace std;
const int maxn=100005;
const int maxh=1000005;
int c1[maxh],c2[maxh],n,h[maxn];
long long cnt[100005];
long long judge[100005];
int lowbit(int x){
return x&(-x);
}
void add(int pos,int d,int *c){
while(pos<maxh){
c[pos]+=d;
pos+=lowbit(pos);
}
}
int getsum(int pos,int *c){
int sum=0;
while(pos>0){
sum+=c[pos];
pos-=lowbit(pos);
}
return sum;
}
int main(){
judge[0]=0;
for(int i=1;i<100005;i++){
judge[i]=judge[i-1]+i;
}
while(cin>>n){
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++){
cin>>h[i];
add(h[i]+1,1,c1);
cnt[i]+=i-getsum(h[i]+1,c1);
}
if(n==1){
cout<<0<<endl;
continue;
}
for(int i=n;i>0;i--){
add(h[i]+1,1,c2);
cnt[i]+=getsum(h[i]+1,c2)-1;
cnt[i]-=getsum(h[i]+1,c2)-getsum(h[i],c2)-1;
}
long long sum=0;
for(int i=1;i<=n;i++){
sum+=judge[cnt[i]];
}
cout<<sum;
}
return 0;
}