import
java.util.*;
public
class
Main {
static
class
BinaryIndexTree {
private
int
[] arr;
public
BinaryIndexTree(
int
size)
{
arr =
new
int
[size +
1
];
Arrays.fill(arr,
0
);
}
public
void
update(
int
x,
int
val)
{
if
(x ==
0
)
return
;
for
(; x < arr.length; x += x & -x)
arr[x] += val;
}
public
int
query(
int
index)
{
if
(index ==
0
)
return
0
;
int
sum =
0
;
for
(; index >
0
; index -= index & -index)
sum += arr[index];
return
sum;
}
}
static
int
[] retResult(
int
[] arr,
int
n)
{
int
[] arrSorted = Arrays.copyOf(arr, arr.length);
Arrays.sort(arrSorted);
Map<Integer, Integer> map
=
new
HashMap<Integer, Integer>();
for
(
int
i =
0
; i < arrSorted.length; i++) {
map.put(arrSorted[i], i +
1
);
}
int
[] arrIndexes =
new
int
[arr.length];
int
idx =
0
;
for
(
int
key : arr) {
arrIndexes[idx++] = map.get(key);
}
BinaryIndexTree bitRightLesser
=
new
BinaryIndexTree(arr.length +
1
);
int
[] right =
new
int
[n];
for
(
int
i = n -
1
; i >=
0
; i--) {
right[i]
= bitRightLesser.query(arrIndexes[i] -
1
);
bitRightLesser.update(arrIndexes[i],
1
);
}
for
(
int
i =
0
; i < n; i++) {
arrIndexes[i] = n +
1
- arrIndexes[i];
}
BinaryIndexTree bitLeftGreater
=
new
BinaryIndexTree(arr.length +
1
);
int
[] left =
new
int
[n];
for
(
int
i =
0
; i < n; i++) {
left[i]
= bitLeftGreater.query(arrIndexes[i] -
1
);
bitLeftGreater.update(arrIndexes[i],
1
);
}
int
[] ret =
new
int
[n];
for
(
int
i =
0
; i < n; i++) {
ret[i] = Math.abs(right[i] - left[i]);
}
return
ret;
}
public
static
void
main(String[] args)
{
int
[] arr = {
5
,
4
,
3
,
2
,
1
};
int
n = arr.length;
int
[] ret = retResult(arr, n);
System.out.println(Arrays.toString(ret));
}
}