#include <vector>
class Solution {
public:
    int mod = 1000000007;
    int InversePairs(vector<int>& nums) {
        //
        int n = nums.size();
        vector<int> temp(n); 
        int ret = 0;
        merge_sort(nums, 0, n - 1, temp, ret); //这里记住temp一定得是引用类型的,不然超出内存
        return ret;

    }
   void  merge_sort(vector<int>& nums, int left, int right, vector<int>& temp, int & ret){
        if(left >= right) return;//当只有一个元素的时候进行返回

        int mid = left + ((right - left)>>1);
        merge_sort(nums, left, mid, temp, ret);
        merge_sort(nums, mid + 1, right, temp, ret);
        merge_(nums, left, mid, right, temp, ret); //此时进行合并,两个集合之间进行计算有多少逆序数

   }
   void merge_(vector<int> & nums, int left, int mid, int right, vector<int> &temp, int & ret){
        int i = left, j = mid + 1, k = 0;
        while(i <= mid && j <= right){ 
            if(nums[i] >nums[j]){
                temp[k++] = nums[j++];
                ret += (mid - i + 1); //只有当i指向的元素大于j指向的元素才计算逆序对,同时将temp中的元素进行更新,temp存储的是有序的
                ret %= mod;
            }
            else{
                temp[k++] = nums[i++];
            }
        }
        //下面两个while用来处理i或j已经到达终点的情况,而另外一个(i或j) 还没有完全更新至temp中
        while(i <= mid) temp[k++] = nums[i++];
        while(j <= right) temp[k++] = nums[j++];
        for(k = 0, i = left; i <= right; ++i, ++k){
            nums[i] = temp[k]; //更新left到right下标中的元素,局部有序
        }
   }
};