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;
}
};