class Solution {
public:
    int cnt;
    const int MOD = 1000000007;

    int InversePairs(vector<int> data) {
        vector<int> tmp(data.size());
        cnt = 0;
        merge_sort(data, 0, data.size(), tmp);
        return cnt;
    }

    void merge_sort(vector<int>& data, int l, int r, vector<int>& tmp) {
        if (r - l > 1) {
            int m = l + (r - l) / 2, p = l, q = m, i = l;
            merge_sort(data, l, m, tmp);
            merge_sort(data, m, r, tmp);
            while (p < m && q < r) {
                if (data[p] <= data[q]) tmp[i++] = data[p++];
                else {
                    cnt = (cnt + (m - p) % MOD) % MOD;
                    tmp[i++] = data[q++];
                }
            }
            while (p < m) tmp[i++] = data[p++];
            while (q < r) tmp[i++] = data[q++];
            for (int j = l; j < r; j++) data[j] = tmp[j];
        }
    }
};