Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
1.3 kB
20
Indexable
Never
public class Solution {
    public int solve(int[] A) {
        return ip(A, 0, A.length - 1);
    }
    
    public int ip(int[] arr, int l, int r){
        if(l == r){
            return 0;
        }
        int mid = (l + r) / 2;
        long f1 = ip(arr, l, mid);
        long f2 = ip(arr, mid + 1, r);
        long f3 = merge(arr, l, mid + 1, r);
        return (int)((f1 + f2 + f3) % 1000000007);
    }
    
    public long merge(int[] arr, int l, int y, int r){
        //subarray from l to y - 1 is sorted and subarray from y to r is sorted
        int[] res = new int[r - l + 1];
        int i = l, j = y, k = 0;
        long ip = 0;
        
        while(i < y && j <= r){
            if(arr[i] <= arr[j]){
                res[k] = arr[i];
                i++;
                k++;
            }else{
                res[k] = arr[j];
                j++;
                k++;
                ip = ip + (y - i);
            }
        }
        
        while(i < y){
            res[k] = arr[i];
            i++;
            k++;
        }
        
        while(j <= r){
            res[k] = arr[j];
            j++;
            k++;
        }
        
        k = 0;
        for(i = l ; i <= r; i++){
            arr[i] = res[k];
            k++;
        }
        
        return ip;
    }
}