Use this to learn the idea, then write your own version.
123 45class Solution(object):6 def handleQuery(self, nums1, nums2, queries):7 """8 :type nums1: List[int]9 :type nums2: List[int]10 :type queries: List[List[int]]11 :rtype: List[int]12 """13 class SegmentTree(object): 14 def __init__(self, N,15 build_fn=lambda _: 0,16 query_fn=lambda x, y: y if x is None else max(x, y),17 update_fn=lambda x, y: y if x is None else x+y):18 self.base = N19 self.H = (N-1).bit_length()20 self.query_fn = query_fn21 self.update_fn = update_fn22 self.tree = [None]*(2*N)23 self.lazy = [None]*N24 for i in xrange(self.base, self.base+N):25 self.tree[i] = build_fn(i-self.base)26 for i in reversed(xrange(1, self.base)):27 self.tree[i] = query_fn(self.tree[2*i], self.tree[2*i+1])28 29 def __apply(self, x, val):30 self.tree[x] = self.update_fn(self.tree[x], val)31 if x < self.base:32 self.lazy[x] = self.update_fn(self.lazy[x], val)33 34 def update(self, L, R, h): 35 def pull(x):36 while x > 1:37 x >>= 138 self.tree[x] = self.query_fn(self.tree[x<<1], self.tree[(x<<1)+1])39 if self.lazy[x] is not None:40 self.tree[x] = self.update_fn(self.tree[x], self.lazy[x])41 42 if L > R:43 return44 L += self.base45 R += self.base46 L0, R0 = L, R47 while L <= R:48 if L & 1: 49 self.__apply(L, h)50 L += 151 if R & 1 == 0: 52 self.__apply(R, h)53 R -= 154 L >>= 155 R >>= 156 pull(L0)57 pull(R0)58 59 def query(self, L, R): 60 def push(x):61 n = self.H62 while n:63 y = x >> n64 if self.lazy[y] is not None:65 self.__apply(y<<1, self.lazy[y])66 self.__apply((y<<1)+1, self.lazy[y])67 self.lazy[y] = None68 n -= 169 70 result = None71 if L > R:72 return result73 74 L += self.base75 R += self.base76 push(L)77 push(R)78 while L <= R:79 if L & 1: 80 result = self.query_fn(result, self.tree[L])81 L += 182 if R & 1 == 0: 83 result = self.query_fn(result, self.tree[R])84 R -= 185 L >>= 186 R >>= 187 return result88 89 st = SegmentTree(len(nums1),90 build_fn=lambda i: (nums1[i], nums1[i]^1),91 query_fn=lambda x, y: y if x is None else (x[0]+y[0], x[1]+y[1]),92 update_fn=lambda x, y: y if x is None else (x[1], x[0]) if y == (1, 0) else x)93 result = []94 total = sum(nums2)95 for t, a, b in queries:96 if t == 1:97 st.update(a, b, (1, 0))98 elif t == 2:99 total += st.query(0, len(nums1)-1)[0]*a100 elif t == 3:101 result.append(total)102 return result103