class Solution {
  public:
  //利用归并排序进行逆序对的计数
  //容易错误之处:用于比较的临时数组temp应当在递归函数内建立,而不是传一个临时数组的引用到函数内。这样能每次递归都使子函数有序,用排列好的子数组计算逆序对才有意义,否则res+=mid-i+1计算逆序对的方法就是错误的(因为这种计算方法是基于有序子数组)
    int mod=int(1e9+7);
    int InversePairs(vector<int>& nums) {
        int left = 0;
        int right = nums.size() - 1;
        vector <int> temp(nums.size());
        return MergeSort(left, right, nums, temp);
    }
    int MergeSort(int left, int right, vector <int>& data, vector <int>& temp) {
        if (left >= right)return 0;
        int mid = left + ((right - left) >> 1);
        int res = MergeSort(left, mid, data, temp) + MergeSort(mid + 1, right, data,temp);
        res%=mod;
        for (int k = left; k <= right; k++) temp[k] = data[k];
        int i = left, j = mid + 1;
        for (int k = left; k <= right; k++) {
            if (i == mid + 1)data[k] = temp[j++];
            else if (j == right + 1 || temp[i] <= temp[j]) data[k] = temp[i++];
            else {
                res += mid - i + 1, data[k] = temp[j++];
            }
        }
        return res%mod;

    }
};