#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param nums int整型一维数组 
# @return int整型
#
import math
class Solution:
    mod = 1000000007
    def merge_sort(self, start_index, end_index, nums):
        """
        
        """
        if start_index == end_index:
            return 0, [nums[start_index]]
        
        if (start_index + end_index) % 2 == 0:
            mid = int((start_index + end_index) / 2)
        else:
            mid = int((start_index + end_index + 1) / 2)

        # print("start, mid, end:",start_index, mid, end_index)

        if mid <= start_index + 1:
            res1 = 0
            nums1 = [nums[start_index]]
        else:
            res1, nums1 = self.merge_sort(start_index, mid, nums)
        
        # print("merge_sort input:", start_index, mid, nums)
        # print("merge_sort output:", res1, nums1)

        if mid + 1 >= end_index:
            res2 = 0
            nums2 = [nums[mid]]
        else:
            res2, nums2 = self.merge_sort(mid, end_index, nums)
        
        # print("merge_sort input:", mid, end_index, nums)
        # print("merge_sort output:", res2, nums2)

        res = (res1 + res2) % self.mod

        # print("res1:", res1, " res2:", res2)
        # print("nums1:", nums1, " num2:", nums2)

        new_nums = []

        if nums1[-1] < nums2[0]:
            new_nums = nums1
            new_nums.extend(nums2)
        elif nums2[-1] < nums1[0]:
            res += len(nums1) * len(nums2)
            new_nums = nums2
            new_nums.extend(nums1)
        else:
            nums1_len = len(nums1)
            i = 0

            nums2_len = len(nums2)
            j = 0

            while True:
                if nums1[i] < nums2[j]:
                    new_nums.append(nums1[i])
                    i += 1
                elif nums1[i] > nums2[j]:
                    res += nums1_len - i
                    new_nums.append(nums2[j])
                    j += 1

                if i >= nums1_len:
                    new_nums.extend(nums2[j:])
                    break

                if j >= nums2_len:
                    new_nums.extend(nums1[i:])
                    break

        return res % self.mod, new_nums


    def InversePairs(self , nums: List[int]) -> int:
        len_ = len(nums)
        res, new_nums = self.merge_sort(0, len_, nums)

        print("new_nums:", new_nums)

        return res % 1000000007