class Solution {
public:
    /**
        一个数比后面的某一个数大则就是一个逆序对,计数就加1;
        暴力检测每个数N^2,利用分治算法,从下往上时,计数同时进行排序原数组,因为数组有序减少了比较时间
     */
    int count = 0;
    int const mod = 1000000007;

    int InversePairs(vector<int>& nums) {
        int n = nums.size();
        if(n<2)return 0;

        dp(nums, 0, nums.size()-1);
        
        return count; 
    }

    void dp(vector<int>& nums, int left, int right){
        if(left >= right) return;

        int mid = left + (right-left)/2;

        dp(nums, left, mid);

        dp(nums, mid+1, right);  //两边排好了序

        vector<int> temp;
        int l_vec=left, r_vec=mid+1; //进行检测,并排序
        while(l_vec <= mid && r_vec <=right){
            if(nums[l_vec] > nums[r_vec]){  //当前是逆序对
                count += mid - l_vec + 1;
                count %= mod;
                temp.push_back(nums[r_vec]);  //把小的放入,进行排序
                r_vec++;
            }else{  //当前不是逆序对
                temp.push_back(nums[l_vec]);  
                l_vec++;
            }
        }

        while(l_vec <=mid){ //如果左数组剩余
            temp.push_back(nums[l_vec] );
            l_vec++;
        }

        while(r_vec <= right){
            temp.push_back(nums[r_vec]);
            r_vec++;
        }

        int index = left;
        //排好序之后改变其原来的数组
        for(int num:temp){
            nums[index] = num;
            index++;
        }
    }



};