树状数组
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct TT
{
long long num,id;
}a[100010];
int n;
long long num[100010],tree[100010],tree2[100010];
bool cmp(TT a,TT b)
{
return a.num<b.num;
}
int lowbit(int n)
{
return n&(-n);
}
long long getsum(int x)//左边比X小的
{
long long sum=0;
for(int i=x;i>=1;i-=lowbit(i))
sum+=tree[i];
return sum;
}
void update(int x)
{
for(int i=x;i<=n;i+=lowbit(i))
tree[i]++;
}
long long getsum2(int x)//左边比X大的
{
long long sum=0;
for(int i=x;i<=n;i+=lowbit(i))
sum+=tree2[i];
return sum;
}
void update2(int x)
{
for(int i=x;i>=1;i-=lowbit(i))
tree2[i]++;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(tree,0,sizeof(tree));
memset(tree2,0,sizeof(tree2));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].num);
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++) num[a[i].id]=i;
long long sum=0;
for(int i=1;i<=n;i++)
{
int x=num[i];
long long t1=getsum(x);//左边比他小的
update(x);
long long t2=getsum2(x);
update2(x);//左边比他大的
long long t3=num[i]-t1-1;//右边比他小的
long long t4=(n-num[i])-t2;//右边比他大的
sum+=t1*t4+t2*t3;
}
cout<<sum<<endl;
}
return 0;
}