class Solution {
public:
const int P = 1000000007;
int merge(vector<int> &data, int l, int r){ //y总的归并排序
if(l >= r) return 0; //一个数 直接返回
int mid = (l + r) >> 1;
int res = merge(data, l, mid) + merge(data, mid + 1, r); //两个子区间内部先找
int i = l , j = mid + 1;
vector<int> temp; //记录当前大区间内部的归并结果
while(i <= mid && j <= r){
if(data[i] <= data[j]) temp.push_back(data[i ++]);
else {
temp.push_back(data[j ++]);
res += mid - i + 1; //两个字区间之间找,这两个子区间已经各自有序
if(res >= P) res %= P;
}
}
while(i <= mid) temp.push_back(data[i ++]); //对于另一个没遍历完的子区间,直接排到后面
while(j <= r) temp.push_back(data[j ++]);
i = l;
for(auto x : temp) data[i ++] = x; //temp放回原来的归并序列,本次归并完成
return res;
}
int InversePairs(vector<int> data) {
return merge(data, 0, data.size()-1);
}
};