class PrefixSumArray:
def __init__(self, arr):
self.arr = arr
self.prefix_sums = []
self.build_prefix_sums()
def build_prefix_sums(self):
if not self.arr:
return
self.prefix_sums.append(self.arr[0]) # start with first element
for i in range(1, len(self.arr)):
# add current element to last prefix sum
self.prefix_sums.append(self.prefix_sums[i-1] + self.arr[i])
def range_sum(self, left, right):
# sum from left to right using prefix sums
if left == 0:
return self.prefix_sums[right]
return self.prefix_sums[right] - self.prefix_sums[left - 1]
# Driver code
arr = [2, 4, 6, 8, 10]
prefix_sum_obj = PrefixSumArray(arr)
print('Prefix sums:', ' -> '.join(map(str, prefix_sum_obj.prefix_sums)) + ' -> null')
# Example: sum from index 1 to 3 (4 + 6 + 8)
sum_1_3 = prefix_sum_obj.range_sum(1, 3)
print('Sum from index 1 to 3:', sum_1_3)self.prefix_sums.append(self.arr[0]) # start with first element
initialize prefix sums with first element of array
self.prefix_sums.append(self.prefix_sums[i-1] + self.arr[i])
add current element to previous prefix sum to build cumulative sums
if left == 0:
return self.prefix_sums[right]
if sum starts from index 0, return prefix sum at right index
return self.prefix_sums[right] - self.prefix_sums[left - 1]
subtract prefix sums to get sum of subarray from left to right
Prefix sums: 2 -> 6 -> 12 -> 20 -> 30 -> null
Sum from index 1 to 3: 18