树状数组版子题
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e4+10;
int n,m;
int c1[maxn],c2[maxn];
int A[maxn],_A[maxn];
int Lef[maxn],Rit[maxn];
inline int _Q(int val){
return lower_bound(_A+1,_A+m+1,val)-_A;
}
inline int lowbit(int i){
return i&(-i);
}
void add(int *C,int pos,int val){
while(pos<=maxn){
C[pos]+=val;
pos+=lowbit(pos);
}
}
int sum(int *C,int pos){
int res=0;
while(pos>0){
res+=C[pos];
pos-=lowbit(pos);
}
return res;
}
int main(){
cin>>n;
for(int i=1;i<=n;++i){
scanf("%d",&A[i]);
_A[i]=A[i];
}
sort(_A+1,_A+n+1);
m=unique(_A+1,_A+n+1)-(_A+1);
for(int i=1;i<=n;++i){
add(c1,_Q(A[i]),1);
Lef[i]=sum(c1,_Q(A[i])-1);
}
for(int i=n;i>=1;--i){
add(c2,_Q(A[i]),1);
Rit[i]=n-i-(sum(c2,_Q(A[i]))-1);
}
long long ans=0;
for(int i=2;i<n;++i) ans+=Lef[i]*Rit[i];
cout<<ans;
return 0;
}