using
System;
public
class
GFG {
static
void
findSubarrayInversions(
int
[] arr,
int
n)
{
int
[, ] greater =
new
int
[n, n];
int
[, ] prefix =
new
int
[n, n];
int
[, ] inversions =
new
int
[n, n];
for
(
int
i = 0; i < n; i++) {
for
(
int
j = 0; j < n; j++) {
greater[i, j] = 0;
prefix[i, j] = 0;
inversions[i, j] = 0;
}
}
for
(
int
i = 0; i < n; i++) {
for
(
int
j = i + 1; j < n; j++) {
greater[i, j] = greater[i, j - 1];
if
(arr[i] > arr[j])
greater[i, j]++;
}
}
for
(
int
j = 0; j < n; j++) {
prefix[0, j] = greater[0, j];
for
(
int
i = 1; i < n; i++) {
prefix[i, j]
= prefix[i - 1, j] + greater[i, j];
}
}
for
(
int
i = 0; i < n; i++) {
for
(
int
j = i; j < n; j++) {
if
(i == 0)
inversions[i, j] = prefix[j, j];
else
inversions[i, j]
= prefix[j, j] - prefix[i - 1, j];
}
}
for
(
int
i = 0; i < n; i++) {
for
(
int
j = 0; j < n; j++) {
Console.Write(inversions[i, j] +
" "
);
}
Console.WriteLine();
}
}
public
static
void
Main(
string
[] args)
{
int
n = 7;
int
[] arr = { 3, 6, 1, 6, 5, 3, 9 };
findSubarrayInversions(arr, n);
}
}