Given an array `nums`

, we call `(i, j)`

an ** important reverse pair** if

`i < j`

and `nums[i] > 2*nums[j]`

.You need to return the number of important reverse pairs in the given array.

**Example1:**

Input: [1,3,2,3,1]Output: 2

**Example2:**

Input: [2,4,3,5,1]Output: 3

**Note:**

- The length of the given array will not exceed
`50,000`

. - All the numbers in the input array are in the range of 32-bit integer.

# Solution 1: Using Binary Index Tree, which has O(nlogn) time complexity. class BIT(): def __init__(self, n): self.n = n + 1 self.sums = [0] * self.n def update(self, i, delta): while i < self.n: self.sums[i] += delta i += i & (-i) def query(self, i): res = 0 while i > 0: res += self.sums[i] i -= i & (-i) return res class Solution: def reversePairs(self, nums: List[int]) -> int: sorted_nums = sorted(list(set(nums + [x * 2 for x in nums]))) tree = BIT(len(sorted_nums)) res = 0 ranks = {} for i, n in enumerate(sorted_nums): ranks[n] = i + 1 for n in nums[::-1]: res += tree.query(ranks[n] - 1) tree.update(ranks[n * 2], 1) return res

# Solution 2: At this time, we are going to use bisect. Got inspiration from Merge Sort (Divide and Conquer). class Solution: def reversePairs(self, nums: List[int]) -> int: ranks = list() ans = 0 for n in reverse(nums): ans += bisect.bisect_left(ranks, n) bisect.insort_left(ranks, n * 2) return ans