import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    private static int MOD = 1_000_000_007;
    private static int[] temp = new int[1_000_00];  // 辅助数组

    public int InversePairs (int[] nums) {
        // write code here
        return sort(nums, 0, nums.length - 1);
    }

    private static int sort(int[] nums, int left, int right) {
        if (left == right) {
            return 0;
        }
        int mid = left + (right - left) / 2;
        int cnt1 = sort(nums, left, mid);  // 左边逆序对数
        int cnt2 = sort(nums, mid + 1, right);  // 右边逆序对数

        int ans = (cnt1 + cnt2) % MOD;
        int i = left, j = mid + 1, k;  // 进行归并排序
        for (k = left; i <= mid && j <= right; k++) {
            if (nums[i] <= nums[j]) {
                temp[k] = nums[i++];
            } else {
                temp[k] = nums[j++];
                ans = (ans + mid - i + 1) % MOD;  // nums[j] 构成的逆序对数
            }
        }
        while (i <= mid) {
            temp[k++] = nums[i++];
            // 此处不会再构成逆序对 因为在上面中右侧所有的逆序对都已经计算过
        }
        while (j <= right) {
            temp[k++] = nums[j++];  
        }
        for (k = left; k <= right; k++) {
            nums[k] = temp[k];
        }
        return ans;  // 总个数
    }
}