diff --git a/Implement a segment tree for range queries b/Implement a segment tree for range queries new file mode 100644 index 0000000..3bb2baf --- /dev/null +++ b/Implement a segment tree for range queries @@ -0,0 +1,57 @@ +class SegmentTree: + def __init__(self, arr): + self.n = len(arr) + self.tree = [0] * (4 * self.n) + self.build_tree(arr, 0, 0, self.n - 1) + + def build_tree(self, arr, idx, left, right): + if left == right: + self.tree[idx] = arr[left] + else: + mid = (left + right) // 2 + self.build_tree(arr, 2 * idx + 1, left, mid) + self.build_tree(arr, 2 * idx + 2, mid + 1, right) + self.tree[idx] = min(self.tree[2 * idx + 1], self.tree[2 * idx + 2]) + + def query(self, idx, left, right, ql, qr): + if ql <= left and right <= qr: # The segment is fully inside the query range + return self.tree[idx] + if right < ql or left > qr: # The segment is fully outside the query range + return float('inf') + mid = (left + right) // 2 + left_min = self.query(2 * idx + 1, left, mid, ql, qr) + right_min = self.query(2 * idx + 2, mid + 1, right, ql, qr) + return min(left_min, right_min) + + def range_query(self, ql, qr): + if ql < 0 or qr >= self.n or ql > qr: + return float('inf') # Invalid query range + return self.query(0, 0, self.n - 1, ql, qr) + + def update(self, idx, left, right, pos, new_val): + if left == right: + self.tree[idx] = new_val + else: + mid = (left + right) // 2 + if pos <= mid: + self.update(2 * idx + 1, left, mid, pos, new_val) + else: + self.update(2 * idx + 2, mid + 1, right, pos, new_val) + self.tree[idx] = min(self.tree[2 * idx + 1], self.tree[2 * idx + 2]) + + def point_update(self, pos, new_val): + if 0 <= pos < self.n: + self.update(0, 0, self.n - 1, pos, new_val) + +# Example usage: +arr = [1, 3, 2, 4, 6, 5, 8, 7] +segment_tree = SegmentTree(arr) + +print("Range Minimum Queries:") +print(segment_tree.range_query(0, 3)) # Output: 1 (Minimum in range [0, 3]) +print(segment_tree.range_query(2, 5)) # Output: 2 (Minimum in range [2, 5]) +print(segment_tree.range_query(1, 6)) # Output: 2 (Minimum in range [1, 6]) + +segment_tree.point_update(3, 0) # Update element at index 3 to 0 +print("After Point Update:") +print(segment_tree.range_query(0, 3)) # Output: 0 (Minimum in range [0, 3])