class Solution {
public:
int mergeSort(vector<int>&nums,vector<int>&temp,int left,int right){
if(left>=right)return 0;
int mid=left+(right-left)/2;
int i=left,j=mid+1;
int pos=left;
long long inv_count=mergeSort(nums,temp,left,mid)+mergeSort(nums,temp,mid+1,right);
while(i<=mid && j<=right){
if(nums[i]<=nums[j]){
temp[pos]=nums[i];
i++;
inv_count+=(j-(mid+1));
}else{
temp[pos]=nums[j];
j++;
}
pos++;
}
for(int k=i;k<=mid;k++){
temp[pos++]=nums[k];
inv_count+=(j-(mid+1));
}
for(int k=j;k<right;k++){
temp[pos++]=nums[k];
}
copy(temp.begin()+left,temp.begin()+right+1,nums.begin()+left);
return inv_count%1000000007;
}
int InversePairs(vector<int> data) {
vector<int>temp(data.begin(),data.end());
return mergeSort(data,temp,0,data.size()-1);
}
};