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