/**
 * 
 * @param {*} arrs 数组
 * @param {*} l 左边界下标
 * @param {*} r 右边界下标
 */
const merge_sort = function(arrs, l, r) {
  if (l >= r) return 0 // 左右边界重合说明只剩一个元素
  let result = 0,
    middle = (l + r) >> 1// 计算左右中间值

  result += merge_sort(arrs, l, middle), // 获取左半部分逆序对个数
  result += merge_sort(arrs, middle + 1, r); // 获取右半部分逆序对个数

  let temp = [] // 创建一个存储空间,用于合并已排好序的数组
  // 指定左右两边起始位置
  let p1 = l, p2 = middle + 1

  // 循环条件:左边不为空或右边不为空
  while(p1 <= middle || p2 <= r) {
    // 右边不存在或左边元素存在且值小于右边, 
    // 将左边元素存入 tmp 中,并将下标往后走一位
    if (p2 > r || (p1 <= middle && arrs[p1] <= arrs[p2])) {
      temp.push(arrs[p1++])
    } else {
      temp.push(arrs[p2++])
      result += (middle - p1 + 1)
    }
  }

  // 覆盖arrs中下标l至r的元素
  for (let i = l; i <= r; i++) {
    arrs[i] = temp[i - l]
  }
  return result
}
var reversePairs = function(nums) {
  return merge_sort(nums, 0, nums.length - 1);
};