import java.util.*;


public class Solution {
    /*
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型
     */
    public int InversePairs (int[] nums) {
        // write code here
        return mergeSort(nums, 0, nums.length - 1);
    }

    public int merge(int[] num, int left, int mid, int right) {
        int tmpRight = mid;
        int tmpLeft = left;
        long reverseNum = 0;

        //计算逆序数
        while (tmpLeft < mid && tmpRight <= right) {
            if (num[tmpLeft] > num[tmpRight]) {
                //num[tmpLeft]满足条件的话,tmpLeft--mid中间(不包括边界)的元素也满足条件。取模防止溢出
                reverseNum+=(mid-tmpLeft) % 1000000007;
                tmpRight++;
            } else {
                tmpLeft++;
                
            }
        }
        //不需要合并直接返回 
        if(left >= right) return (int)reverseNum  % 1000000007;
        //合并
        int[] newNum = new int[right - left + 1];
        tmpLeft = left;
        tmpRight = mid;
        int index = 0;
        while (tmpLeft < mid && tmpRight <= right) {
            if (num[tmpLeft] < num[tmpRight]) {
                newNum[index] = num[tmpLeft];
                index++;
                tmpLeft++;
            }
            else {
                newNum[index] = num[tmpRight];
                tmpRight++;
                index++;
            }
        }
        //不需要继续比较大小,可以直接放入新数组的部分
        while(tmpLeft < mid) {
            newNum[index] = num[tmpLeft];
            tmpLeft++;
            index++; 
        }
        while(tmpRight <= right) {
            newNum[index] = num[tmpRight];
            tmpRight++;
            index++; 
        }
        index = 0;
        for(int i=left;i<=right;i++){
            num[i] = newNum[index];
            index++;
        }
        return (int)reverseNum  % 1000000007;
    }

    public int mergeSort(int[] num, int left, int right) {
        int mid = (right + left) / 2;
        int reverseNum = 0;
        if (left < right) {
            reverseNum += mergeSort(num, left, mid);
            reverseNum += mergeSort(num, mid + 1, right);
        }
        reverseNum += merge(num, left, mid + 1, right);
        return reverseNum % 1000000007;
    }
}