class Solution {
    //1.logn次分割递归 每一层n次操作
    //2.辅助数组可以放排序数组 也可以先复制辅助数组原数组排序 递归传递引用数组
    //3.取模结果需要将count设置为long型 原数组数值只需要作比较int即可
public:    
    long mergesort(vector<int> &nums, vector<int> &temp, int left, int right){
        if(left==right){
            return 0;
        }//digui tingzhi tiaojian 
        int mid=(left+right)/2;
        long countl=mergesort(nums,temp,left, mid);
        long countr=mergesort(nums,temp,mid+1,right);
        long count=0;
        for(int i=left;i<=right;i++){
            temp[i]=nums[i];
        }//fuzhi 
        int i1=left, i2=mid+1;//double pointer
        for(int curr=left;curr<=right;curr++){
            if(i1==mid+1){
                nums[curr]=temp[i2++];//left over, copy right
            }
            else if(i2==right+1){
                nums[curr]=temp[i1++];
            }//right over, copy left
            else if(temp[i1]<temp[i2]){
                nums[curr]=temp[i1++];
            }
            else{
                nums[curr]=temp[i2++];
                count+=mid-i1+1;
            }
        }
        return countl+countr+count;
    }
    int InversePairs(vector<int>& nums) {
        vector<int>temp(nums.size());
        long re=mergesort(nums,temp,0,nums.size()-1);
        /*for(auto num:nums){
            cout<<num<<' ';
        }*/
        
        return re % 1000000007;
    }
};