Use this to learn the idea, then write your own version.
123 4class BIT(object): 5 def __init__(self, n):6 self.__bit = [0]*(n+1) 7 8 def add(self, i, val):9 i += 1 10 while i < len(self.__bit):11 self.__bit[i] += val12 i += (i & -i)13 14 def query(self, i):15 i += 1 16 ret = 017 while i > 0:18 ret += self.__bit[i]19 i -= (i & -i)20 return ret21 22 2324class Solution(object):25 def treeQueries(self, n, edges, queries):26 """27 :type n: int28 :type edges: List[List[int]]29 :type queries: List[List[int]]30 :rtype: List[int]31 """32 def iter_dfs():33 L, R, dist, lookup = [0]*n, [0]*n, [0]*n, [0]*n34 cnt = 035 stk = [(1, (0, -1, 0))]36 while stk:37 step, args = stk.pop()38 if step == 1:39 u, p, d = args40 L[u] = cnt41 cnt += 142 dist[u] = d43 stk.append((2, (u,)))44 for v, w in adj[u]:45 if v == p:46 continue47 lookup[v] = w48 stk.append((1, (v, u, d+w)))49 elif step == 2:50 u = args[0]51 R[u] = cnt52 return L, R, dist, lookup53 54 adj = [[] for _ in xrange(n)]55 for u, v, w in edges:56 u -= 157 v -= 158 adj[u].append((v, w))59 adj[v].append((u, w))60 L, R, dist, lookup = iter_dfs()61 bit = BIT(n)62 result = []63 for q in queries:64 if q[0] == 1:65 _, u, v, w = q66 u -= 167 v -= 168 if L[u] > L[v]:69 u, v = v, u 70 diff = w-lookup[v]71 bit.add(L[v], diff)72 bit.add(R[v], -diff)73 lookup[v] = w74 else:75 _, x = q76 x -= 177 result.append(dist[x]+bit.query(L[x]))78 return result79 80 81828384class Solution2(object):85 def treeQueries(self, n, edges, queries):86 """87 :type n: int88 :type edges: List[List[int]]89 :type queries: List[List[int]]90 :rtype: List[int]91 """92 def dfs(u, p, d):93 L[u] = cnt[0]94 cnt[0] += 195 dist[u] = d96 for v, w in adj[u]:97 if v == p:98 continue99 lookup[v] = w100 dfs(v, u, d+w)101 R[u] = cnt[0]102 103 adj = [[] for _ in xrange(n)]104 for u, v, w in edges:105 u -= 1106 v -= 1107 adj[u].append((v, w))108 adj[v].append((u, w))109 L, R, dist, lookup = [0]*n, [0]*n, [0]*n, [0]*n110 cnt = [0]111 dfs(0, -1, 0)112 bit = BIT(n)113 result = []114 for q in queries:115 if q[0] == 1:116 _, u, v, w = q117 u -= 1118 v -= 1119 if L[u] > L[v]:120 u, v = v, u 121 diff = w-lookup[v]122 bit.add(L[v], diff)123 bit.add(R[v], -diff)124 lookup[v] = w125 else:126 _, x = q127 x -= 1128 result.append(dist[x]+bit.query(L[x]))129 return result130