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