class Solution {
public int reversePairs(int[] nums) {
return mergeSort(nums, 0, nums.length - 1);
}
private int mergeSort(int[] nums, int p, int r) {
if (p >= r) return 0;
int q = p + (r - p) / 2;
int count = mergeSort(nums, p, q) + mergeSort(nums, q + 1, r);
int i = p, j = q + 1;
while (i <= q) {
while (j <= r && nums[i] > 2 * (long)nums[j]) {
j++;
}
count += j - (q + 1);
i++;
}
merge(nums, p, q, r);
return count;
}
private void merge(int[] nums, int p, int q, int r) {
int[] aux = Arrays.copyOfRange(nums, p, r + 1);
int i = 0, j = q + 1 - p;
for (int k = p; k <= r; ++k) {
if (i > q - p) nums[k] = aux[j++];
else if (j > r - p) nums[k] = aux[i++];
else if (aux[i] > aux[j]) nums[k] = aux[j++];
else nums[k] = aux[i++];
}
}
}