主席树不知道错哪了,作差出了负数!
#include<bits/stdc++.h>
using namespace std;
#define I_love_Foccarus return
#define in(a) a=read()
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define deap(i,a,b) for(int i=b;i>=a;i--)
#define pii pair<int,int>
#define mk(a,b) make_pair(a,b)
#define fi first
#define se second
#define pd(a) push_back(a)
//#define int long long
const int N = 1e5 + 5;
const int inf = INT_MAX;
inline int read() {
int ch=getchar(),f=1,x=0;
while('9'<ch||ch<'0') {
if(ch=='-')f=-1;
ch=getchar();
}
while('0'<=ch&&ch<='9') {
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
void fast() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
struct linetree {
int v,cl,cr;
};
vector<linetree>t;
int rt[N];
int change(int idx,int l,int r,int q,int val){
linetree tmp=t[idx];
if(l==r){
tmp.v+=val;
t.push_back(tmp);
return t.size()-1;
}
int mid=(l+r)>>1;
if(q<=mid)tmp.cl=change(t[idx].cl,l,mid,q,val);
else tmp.cr=change(t[idx].cr,mid+1,r,q,val);
tmp.v=t[tmp.cl].v+t[tmp.cr].v;
t.push_back(tmp);
return t.size()-1;
}
int query(int idxl,int idxr,int l,int r,int q){
if(l==r)return 0;
int mid=(l+r)>>1;
if(q<=mid)return t[t[idxr].cr].v-t[t[idxl].cr].v+query(t[idxl].cl,t[idxr].cr,l,mid,q);
else return query(t[idxl].cr,t[idxr].cr,mid+1,r,q);
}
int qry(int idxl,int idxr,int l,int r,int q){
if(l==r)return 0;
int mid=(l+r)>>1;
if(q<=mid)return qry(t[idxl].cl,t[idxr].cr,l,mid,q);
else return t[t[idxr].cl].v-t[t[idxl].cl].v+qry(t[idxl].cr,t[idxr].cr,mid+1,r,q);
}
int a[N],szl[N],szr[N];
signed main() {
//fast();
int n,tot=1e5,ans=0;
in(n);
linetree tmp;
tmp.v=tmp.cl=tmp.cr=0;
t.push_back(tmp);
rep(i,1,n) {
in(a[i]);
rt[i]=change(rt[i-1],1,tot,a[i],1);
}
rep(i,1,n)szl[i]=qry(rt[0],rt[i],1,tot,a[i]);
deap(i,1,n)szr[i]=query(rt[i-1],rt[n],1,tot,a[i]);
rep(i,1,n)ans+=szl[i]*szr[i];
cout<<ans;
I_love_Foccarus 0;
}