1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
class BIT:
def __init__(self, n: int):
self.size = n
self.tree = [0] * (n + 1)
def update(self, index: int, value: int) -> None:
while index <= self.size:
self.tree[index] += value
index += index & -index
def query(self, index: int) -> int:
sum = 0
while index > 0:
sum += self.tree[index]
index -= index & -index
return sum
class Solution:
def process_queries(self, arr: List[int], queries: List[Tuple[int, int, int]]) -> List[int]:
n = len(arr)
result = []
# Step 1: Coordinate compression
sorted_unique = sorted(set(arr))
position = {num: idx + 1 for idx, num in enumerate(sorted_unique)}
# Step 2: Build the BIT
bit = BIT(len(sorted_unique))
compressed_arr = [position[num] for num in arr]
for num in compressed_arr:
bit.update(num, 1)
# Step 3: Process each query
for l, r, x in queries:
count = 0
# Compute the count of elements ≤ x in the range [l, r]
for i in range(l, r + 1):
if arr[i] <= x:
count += bit.query(position[arr[i]])
result.append(count)
return result
# Example usage
sol = Solution()
arr = [1, 3, 5, 7, 9]
queries = [(1, 3, 6), (0, 4, 8)]
result = sol.process_queries(arr, queries)
print(result) # Expected output: [2, 4]
|