class Solution {
public:
    int so(vector<int>&data,int l,int r)
    {
        if(l>=r)return 0;
        int mid=(l+r)>>1,result=(so(data,l,mid)+so(data,mid+1,r))%1000000007;
        int le=mid,ri=r;
        vector<int>d;
        while(le>=l&&ri>=mid+1)
        {
            if(data[le]>data[ri])result+=ri-mid,d.push_back(data[le--]);
            else d.push_back(data[ri--]);
        }
        for(;le>=l;le--)d.push_back(data[le]);
        for(;ri>=mid;ri--)d.push_back(data[ri]);
        for(int i=l;i<=r;i++)
        data[i]=d[r-i];
        return result%1000000007;
    }
    int InversePairs(vector<int> data) {
        return so(data,0,data.size()-1);
    }
};