class SegmentTree:
def __init__(self, data):
self.n = len(data)
self.size = 1
while self.size < self.n:
self.size <<= 1
self.tree = [0] * (2 * self.size)
for i in range(self.n):
self.tree[self.size + i] = data[i]
for i in range(self.size - 1, 0, -1):
self.tree[i] = self.tree[2 * i] + self.tree[2 * i + 1]
def update(self, index, value):
pos = self.size + index
self.tree[pos] = value
pos //= 2
while pos > 0:
self.tree[pos] = self.tree[2 * pos] + self.tree[2 * pos + 1]
pos //= 2
def query(self, left, right): # inclusive left, exclusive right
result = 0
left += self.size
right += self.size
while left < right:
if left % 2 == 1:
result += self.tree[left]
left += 1
if right % 2 == 1:
right -= 1
result += self.tree[right]
left //= 2
right //= 2
return result
# Example usage
data = [2, 1, 5, 3, 4]
st = SegmentTree(data)
print(st.query(1, 4)) # sum from index 1 to 3
st.update(2, 2) # update index 2 to value 2
print(st.query(1, 4))