Beispiel #1
0
def main():
    n = int(input())
    nodes = [list(map(int, input().split())) for i in range(n)]
    q = int(input())
    queries = [list(map(int, input().split())) for i in range(q)]

    tree = [[] for i in range(n)]
    for u in range(n):
        for v in nodes[u][1:]:
            tree[u].append(v)
            tree[v].append(u)

    hld = HLDecomposition(tree)
    bit = BinaryIndexedTree(n)

    ans = []
    for flag, *query in queries:
        if flag == 0:
            v, val = query
            for l, r in hld.range_edge_path(0, v):
                bit.add(l, r, val)
        else:
            v = query[0]
            res = 0
            for l, r in hld.range_edge_path(0, v):
                res += bit.sum(l, r)
            ans.append(res)

    print('\n'.join(map(str, ans)))
Beispiel #2
0
def main():
    n, q = map(int, input().split())
    edges = [list(map(int, input().split())) for i in range(n - 1)]
    queries = [list(map(int, input().split())) for i in range(q)]

    tree = [[] for i in range(n)]
    for u, v in edges:
        tree[u].append(v)
        tree[v].append(u)

    hld = HLDecomposition(tree)
    bit = BinaryIndexedTree(n)

    ans = []
    for flag, *query in queries:
        if flag == 0:
            u, v = query
            res = 0
            for l, r in hld.range_edge_path(u, v):
                res += bit.sum(l, r)
            ans.append(res)
        else:
            v, x = query
            l, r = hld.range_subtree(v)
            bit.add(l, r, x)
            bit.add(hld[v], hld[v] + 1, -x)
    print('\n'.join(map(str, ans)))