简单的树状数组
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
#define MAXN 100010
using namespace std;
int N = MAXN, C[100010], a[20010], _c[20010], _d[20010];
int lowbit(int x)
{
return x & (-x);
}
int sum(int x)
{
int ret = 0;
while (x > 0)
{
ret += C[x];
x -= lowbit(x);
}
return ret;
}
void add(int x, int d)
{
while (x <= N)
{
C[x] += d;
x += lowbit(x);
}
}
int main()
{
int t;
scanf("%d", &t);
while (t --)
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++ i)
{
scanf("%d", &a[i]);
}
memset(C, 0, sizeof(C));
for (int i = 0; i < n; ++ i)
{
add(a[i], 1);
_c[i] = sum(a[i]) - 1;
}
memset(C, 0, sizeof(C));
for (int i = n - 1; i >= 0; -- i)
{
add(a[i], 1);
_d[i] = sum(a[i]) - 1;
}
long long res = 0;
//for (int i = 0; i < n; ++ i) printf("%d ", _c[i]); puts("");
//for (int i = 0; i < n; ++ i) printf("%d ", _d[i]); puts("");
for (int i = 0; i < n; ++ i)
{
res += _c[i] * (n - i - _d[i] - 1) + (i - _c[i]) * _d[i];
}
printf("%lld\n", res);
}
}