AcWing 241
#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
int n;
int nums[N];
int tree[N];
int great[N], low[N]; //储存nums[i]之前有多少个数字大于它,多个数字小于它
inline int lowbit(int i)
{
return i & -i;
}
void add(int p, int val)
{
for (int i = p; i <= n; i += lowbit(i)) {
tree[i] += val;
}
}
int getSum(int p)
{
int ans = 0;
for (int i = p; i; i -= lowbit(i)) {
ans += tree[i];
}
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("D:/VS CODE/C++/in.txt", "r", stdin);
freopen("D:/VS CODE/C++/out.txt", "w", stdout);
#endif
cin >> n;
for (int i = 1; i <= n; ++ i) {
scanf("%d", &nums[i]);
}
for (int i = 1; i <= n; ++ i) {
great[i] = getSum(n) - getSum(nums[i]);
low[i] = getSum(nums[i] - 1);
add(nums[i], 1);
}
long long ans1 = 0, ans2 = 0;
for (int i = 1; i <= n; ++i) {
ans1 += great[i] * (long long)(n - getSum(nums[i]) - great[i]); //v型个数
ans2 += low[i] * (long long)(getSum(nums[i] - 1) - low[i]);
}
printf("%lld %lld", ans1, ans2);
fclose(stdin);
fclose(stdout);
return 0;
}