import
java.util.Arrays;
import
java.util.HashMap;
import
java.util.Map;
public
class
Surpasser {
public
static
void
merge(
int
[] arr,
int
l,
int
m,
int
r, Map<Integer, Integer> hm) {
int
n1 = m - l +
1
;
int
n2 = r - m;
int
[] L =
new
int
[n1];
int
[] R =
new
int
[n2];
for
(
int
i =
0
; i < n1; i++) {
L[i] = arr[l + i];
}
for
(
int
j =
0
; j < n2; j++) {
R[j] = arr[m +
1
+ j];
}
int
i =
0
, j =
0
, k = l;
int
c =
0
;
while
(i < n1 && j < n2) {
if
(L[i] <= R[j]) {
hm.put(L[i], hm.getOrDefault(L[i],
0
) + c);
arr[k++] = L[i++];
}
else
{
arr[k++] = R[j++];
c++;
}
}
while
(i < n1) {
hm.put(L[i], hm.getOrDefault(L[i],
0
) + c);
arr[k++] = L[i++];
}
while
(j < n2) {
arr[k++] = R[j++];
}
}
public
static
void
mergeSort(
int
[] arr,
int
l,
int
r, Map<Integer, Integer> hm) {
if
(l < r) {
int
m = l + (r - l) /
2
;
mergeSort(arr, l, m, hm);
mergeSort(arr, m +
1
, r, hm);
merge(arr, l, m, r, hm);
}
}
public
static
void
findSurpasser(
int
[] arr,
int
n)
{
Map<Integer, Integer> hm =
new
HashMap<>();
int
[] dup = arr.clone();
mergeSort(dup,
0
, n -
1
, hm);
System.out.println(
"Surpasser Count of array is: "
);
for
(
int
i =
0
; i < n; i++) {
if
(hm.containsKey(arr[i]))
System.out.print((n -
1
) - i - hm.get(arr[i]) +
" "
);
else
System.out.print((n -
1
) - i +
" "
);
}
System.out.println();
}
public
static
void
main(String[] args) {
int
[] arr = {
2
,
7
,
5
,
3
,
0
,
8
,
1
};
int
n = arr.length;
System.out.println(
"Given array is: "
+ Arrays.toString(arr));
findSurpasser(arr, n);
}
}