Inversions of an Array (Code360)

def getInversions(arr, n):
    
    def calculate_inversions(A, lx, mx, rx):
        A1 = A[lx:1 + mx]
        A2 = A[mx + 1:rx + 1]
        count = 0
        a1x, a2x, ix = 0, 0, lx
        while a1x < len(A1) and a2x < len(A2):
            if A1[a1x] <= A2[a2x]:
                A[ix] = A1[a1x]
                ix, a1x = ix + 1, a1x + 1
            else:
                A[ix] = A2[a2x]
                count += len(A1) - a1x
                ix, a2x = ix + 1, a2x + 1
        
        while a1x < len(A1):
            A[ix] = A1[a1x]
            ix, a1x = ix + 1, a1x + 1

        while a2x < len(A2):
            A[ix] = A2[a2x]
            ix, a2x = ix + 1, a2x + 1
        
        return count

    def dnc(A, lx, rx):
        count = 0
        if lx < rx:
            mx = lx + (rx - lx) // 2
            count += dnc(A, lx, mx)
            count += dnc(A, mx + 1, rx)
            count += calculate_inversions(A, lx, mx, rx)
        return count

    return dnc(arr, 0, n - 1)