1class Solution {2int cnt;34public int reversePairs(int[] nums) {5int n = nums.length;6cnt = 0;7sort(0, n - 1, nums);8return cnt;9}1011void sort(int l, int r, int nums[]) {12if (l == r) {13return;14}15int mid = l + (r - l) / 2;16sort(l, mid, nums);17sort(mid + 1, r, nums);18merge(l, mid, r, nums);19}2021void merge(int l, int mid, int r, int nums[]) {22int n1 = mid - l + 1;23int n2 = r - mid;24int a[] = new int[n1];25int b[] = new int[n2];26for (int i = 0; i < n1; i++) {27a[i] = nums[l + i];28}29for (int j = 0; j < n2; j++) {30b[j] = nums[mid + 1 + j];31int idx = upperBound(a, 0, n1 - 1, 2L * (long) b[j]);32if (idx <= n1) {33cnt += n1 - idx;34}35}36int i = 0;37int j = 0;38int k = l;39while (i < n1 && j < n2) {40if (b[j] <= a[i]) {41nums[k++] = b[j++];42} else {43nums[k++] = a[i++];44}45}46while (i < n1) {47nums[k++] = a[i++];48}49while (j < n2) {50nums[k++] = b[j++];51}52}5354int upperBound(int a[], int l, int r, long x) {55int ans = r + 1;56while (l <= r) {57int mid = l + (r - l) / 2;58if ((long) a[mid] > x) {59ans = mid;60r = mid - 1;61} else {62l = mid + 1;63}64}65return ans;66}67}