树状数组中的c[i]表示技能值为i的人有c[i]个
b[i]表示在第i个人前面,比第i个人的技能值低的人有b[i]个
d[i]表示在第i个人后面,比第i个人的技能值低的人有d[i]个
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <cstring>
#define LL long long
using namespace std;
int b[30005];
int d[30005];
int c[100005];
int val[30005];
int mn;
int lowerbit(int x){
return x&(-x);
}
void add(int x, int num){
while(x <= mn){
c[x] += num;
x += lowerbit(x);
}
}
int query(int x){
int ret = 0;
while(x > 0){
ret += c[x];
x -= lowerbit(x);
}
return ret;
}
int main()
{
//freopen("ztest.txt","r",stdin);
int n, t;
scanf("%d", &t);
while(t--){
mn = 0;
LL ans = 0;
scanf("%d", &n);
memset(c, 0, sizeof(c));
for(int i = 1; i <= n; i++)
{
scanf("%d", &val[i]);
mn = max(mn, val[i]);
}
memset(b, 0, sizeof(b));
for(int i = 1; i <= n; i++)
{
add(val[i], 1);
b[i] = query(val[i]-1);
}
memset(c, 0, sizeof(c));
memset(d, 0, sizeof(d));
for(int i = n; i >= 1; i--)
{
add(val[i], 1);
d[i] = query(val[i]-1);
}
for(int i = 2; i < n; i++)
{
ans += b[i]*(n-i-d[i]) + (i-b[i]-1)*d[i];
}
printf("%lld\n",ans);
}
return 0;
}