import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.ArrayList;
class GfG {
// Merge function to sort the array
// and update surpasser counts
static void merge(int[] arr, int lo, int mid, int hi,
Map<Integer, Integer> m) {
int n1 = mid - lo + 1;
int n2 = hi - mid;
int[] left = new int[n1];
int[] right = new int[n2];
// Copy data into temporary arrays left[] and right[]
for (int i = 0; i < n1; i++)
left[i] = arr[lo + i];
for (int j = 0; j < n2; j++)
right[j] = arr[mid + 1 + j];
int i = 0, j = 0, k = lo;
// Merging two halves
while (i < n1 && j < n2) {
// All elements in right[j..n2] are greater than left[i]
// So add n2 - j to surpasser count of left[i]
if (left[i] < right[j]) {
m.put(left[i], m.getOrDefault(left[i], 0) + n2 - j);
arr[k++] = left[i++];
}
else {
arr[k++] = right[j++];
}
}
// Copy remaining elements of left[] if any
while (i < n1)
arr[k++] = left[i++];
// Copy remaining elements of right[] if any
while (j < n2)
arr[k++] = right[j++];
}
static void mergeSort(int[] arr, int lo, int hi,
Map<Integer, Integer> m) {
if (lo < hi) {
int mid = lo + (hi - lo) / 2;
// Sort left and right halves
mergeSort(arr, lo, mid, m);
mergeSort(arr, mid + 1, hi, m);
// Merge them
merge(arr, lo, mid, hi, m);
}
}
static ArrayList<Integer> findSurpasser(int[] arr) {
int n = arr.length;
// Map to store surpasser counts
Map<Integer, Integer> m = new HashMap<>();
// Duplicate array to perform merge sort
int[] dup = arr.clone();
mergeSort(dup, 0, n - 1, m);
// Store surpasser counts in result list
ArrayList<Integer> res = new ArrayList<>();
for (int i = 0; i < n; i++)
res.add(m.getOrDefault(arr[i], 0));
return res;
}
public static void main(String[] args) {
int[] arr = {2, 7, 5, 3, 8, 1};
ArrayList<Integer> res = findSurpasser(arr);
for (int count : res)
System.out.print(count + " ");
}
}