import java.util.*;


public class Solution {
    // 思路:归并排序的思想,分治之后排序合并

    public int mod = 1000000007;

    public int mergeSort(int left, int right, int[] nums, int[] temp) {
        if (left >= right) {
            return 0;
        }
        int mid = (left + right) / 2;
        // 递归分治,左右划分合并
        int res = mergeSort(left, mid, nums, temp) + mergeSort(mid + 1, right, nums,
                  temp);
        // 防止溢出
        res %= mod;
        // 排序逻辑处理
        int i = left, j = mid + 1;
        for (int k = left; k <= right; k++) {
            temp[k] = nums[k];
        }
        for (int k = left; k <= right; k++) {
            if (i == mid + 1) {
                nums[k] = temp[j++];
            } else if (j == right + 1 || temp[i] <= temp[j]) {
                nums[k] = temp[i++];
                // 左边比右边大,答案增加
            } else {
                nums[k] = temp[j++];
                // 当左子数组的元素 temp[i] 大于右子数组的元素 temp[j] 时,temp[i] 及其后面的所有元素(从 i 到 mid)都与 temp[j] 构成逆序对,因此逆序对数量增加 mid - i + 1。
                res += mid - i + 1;
            }
        }
        return res % mod;
    }

    public int InversePairs (int[] nums) {
        // write code here
        int n = nums.length;
        int[] res = new int[n];
        return mergeSort(0, n - 1, nums, res);

    }
}