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)