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