Use this to learn the idea, then write your own version.
123 45class Solution(object):6 def maximumSumSubsequence(self, nums, queries):7 """8 :type nums: List[int]9 :type queries: List[List[int]]10 :rtype: int11 """12 MOD = 10**9+713 L0R0, L1R0, L0R1, L1R1 = range(4)14 15 16 class SegmentTree(object):17 def __init__(self, N,18 build_fn=lambda _: None,19 query_fn=lambda x, y: y if x is None else x if y is None else max(x, y),20 update_fn=lambda x: x):21 self.tree = [None]*(1<<((N-1).bit_length()+1))22 self.base = len(self.tree)>>123 self.query_fn = query_fn24 self.update_fn = update_fn25 for i in xrange(self.base, self.base+N):26 self.tree[i] = build_fn(i-self.base)27 for i in reversed(xrange(1, self.base)):28 self.tree[i] = query_fn(self.tree[i<<1], self.tree[(i<<1)+1])29 30 def update(self, i, h):31 x = self.base+i32 self.tree[x] = self.update_fn(h)33 while x > 1:34 x >>= 135 self.tree[x] = self.query_fn(self.tree[x<<1], self.tree[(x<<1)+1])36 37 def query(self, L, R):38 L += self.base39 R += self.base40 left = right = None41 while L <= R:42 if L & 1:43 left = self.query_fn(left, self.tree[L])44 L += 145 if R & 1 == 0:46 right = self.query_fn(self.tree[R], right)47 R -= 148 L >>= 149 R >>= 150 return self.query_fn(left, right)51 52 def build(i):53 return [max(nums[i], 0), 0, 0, 0]54 55 def query(x, y):56 if x is None:57 return y58 if y is None:59 return x60 return [max(x[L0R1]+y[L1R0], x[L0R0]+y[L1R0], x[L0R1]+y[L0R0]),61 max(x[L1R1]+y[L1R0], x[L1R0]+y[L1R0], x[L1R1]+y[L0R0]),62 max(x[L0R1]+y[L1R1], x[L0R0]+y[L1R1], x[L0R1]+y[L0R1]),63 max(x[L1R1]+y[L1R1], x[L1R0]+y[L1R1], x[L1R1]+y[L0R1])]64 65 st = SegmentTree(len(nums), build_fn=build, query_fn=query)66 result = 067 for i, x in queries:68 st.update(i, [max(x, 0), 0, 0, 0])69 result = (result+max(st.tree[1]))%MOD70 return result71