let K = 51;
let N = 100005;
let BIT =
new
Array(K).fill(0).map(() =>
new
Array(N).fill(0));
function
updateBIT(t, i, val, n)
{
while
(i <= n) {
BIT[t][i] = BIT[t][i] + val;
i = i + (i & (-i));
}
}
function
getSum(t, i)
{
let res = 0;
while
(i > 0) {
res = res + BIT[t][i];
i = i - (i & (-i));
}
return
res;
}
function
convert(arr, n)
{
let temp=
new
Array(n);
for
(let i = 0; i < n; i++)
temp[i] = arr[i];
temp.sort();
for
(let i = 0; i < n; i++) {
arr[i] = lower_bound(temp, 0, n, arr[i])+1;
}
}
function
lower_bound(a, low, high, element)
{
while
(low < high)
{
let middle = low + parseInt((high - low) / 2, 10);
if
(element > a[middle])
low = middle + 1;
else
high = middle;
}
return
low;
}
function
getInvCount(arr, n, k)
{
convert(arr, n);
for
(let i = n - 1; i >= 0; i--) {
let x = arr[i];
updateBIT(1, x, 1, n);
for
(let l = 1; l < k; l++) {
updateBIT(l + 1, x, getSum(l, x - 1), n);
}
}
return
getSum(k, n);
}
let arr = [ 5, 6, 4, 9, 3, 7, 2, 1 ];
let n = arr.length;
let k = 4;
console.log(
"Inversion Count : "
+ getInvCount(arr, n, k));