Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions Implement a segment tree for range queries
Original file line number Diff line number Diff line change
@@ -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])