class Solution { public: int MOD = 1000000007; int _merge(vector<int>& data, int left, int right) { if(left >= right) { return 0; } int mid = left + ((right - left) >> 1); vector<int> left_data(data.begin() + left, data.begin() + mid + 1); vector<int> right_data(data.begin() + mid + 1, data.begin() + right + 1); int r = 0; int i = 0, j = 0; int m = left_data.size(), n = right_data.size(); int index = left; while(i < m && j < n) { if(left_data[i] > right_data[j]) { r += m - i; data[index++] = right_data[j++]; } else { data[index++] = left_data[i++]; } } while(i < m) { data[index++] = left_data[i++]; } while(j < n) { data[index++] = right_data[j++]; } return r; } int InversePairs(vector<int>& data, int left, int right) { if(left >= right) { return 0; } int mid = left + ((right - left) >> 1); int r1 = InversePairs(data, left, mid); int r2 = InversePairs(data, mid + 1, right); int r3 = _merge(data, left, right); int r = ((r1 % MOD) + (r2 % MOD)) % MOD; return ((r3 % MOD) + (r % MOD)) % MOD; } int InversePairs(vector<int> data) { return InversePairs(data, 0, data.size() - 1); } };