#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param nums int整型一维数组 
# @return int整型
#
class Solution:
    def __init__(self) -> None:
        self.count = 0
        self.mod = 1000000007
    def merge(self, nums:List[int], left, mid, right):
        # 左右端点
        i = left
        j = mid + 1
        arr_n = []
        while i <= mid and j <= right:
            if nums[i] > nums[j]:
                arr_n.append(nums[j])
                j+=1
                # 重点 不是+1 因为第一个数组的数字比后面的第一个数字大
                # 则第一个数组数组后面的数字也比第一个大
                # [3] 6 9    [1] [4] [10]
                # 第一次要加3 第二次加2
                self.count += mid - i + 1
                self.count %= self.mod 
            else:
                arr_n.append(nums[i])
                i+=1
        while i <= mid:
            arr_n.append(nums[i])
            i+=1     
        while j <= right:
            arr_n.append(nums[j])
            j+=1
        nums[left:right+1] = arr_n
            
    def merge_sort(self, nums, left, right):
        # 1 分开
        # 2 合并时候从哪里开始
        # 不能一直划分
        if left < right:
            mid = (left + right) // 2
            self.merge_sort(nums, left, mid)
            self.merge_sort(nums, mid+1, right)
            self.merge(nums, left, mid, right)

    def InversePairs(self , nums: List[int]) -> int:
        # 为什么此题的最优解法可以借助归并排序的思想?
        # 每一个逆序对其实就是排序时的交换(冒泡 归并)
        if not nums or len(nums) == 1:
            return self.count
        n = len(nums)
        left = 0
        right = n-1
        self.merge_sort(nums, left, right)
        print(nums)
        return self.count