#!/usr/bin/env python3



import sys



sys.setrecursionlimit(10 ** 6)

input = sys.stdin.buffer.readline





n_nodes, q_query = list(map(int, input().split()))



edges = [[] for _ in range(n_nodes)]

for _ in range(n_nodes - 1):

    a, b = list(map(int, input().split()))

    edges[a - 1].append(b - 1)

    edges[b - 1].append(a - 1)



queries = []

for _ in range(q_query):

    p, x = list(map(int, input().split()))

    queries.append([p - 1, x])



# print(n_nodes, q_query)

# print(edges, queries)



res = [0 for _ in range(n_nodes)]

for node, point in queries:

    res[node] += point





def dfs(v, parent):

    for v_next in edges[v]:

        if v_next != parent:

            res[v_next] += res[v]

            dfs(v_next, v)





dfs(0, None)



print((*res))

#!/usr/bin/env python3



from pprint import pprint

import sys



sys.setrecursionlimit(10 ** 6)

input = sys.stdin.buffer.readline

INF = float('inf')





N, Q = list(map(int, input().split()))



graph = [[] for _ in range(N)]

for _ in range(N - 1):

    u, v = list(map(int, input().split()))

    # undirected, 0-indexed

    graph[u - 1].append(v - 1)

    graph[v - 1].append(u - 1)



query = []

for _ in range(Q):

    p, x = list(map(int, input().split()))

    query.append([p - 1, x])



# 方針

# 1. 各クエリに対し、頂点p_jのカウンターにx_jを足す

# (この段階では部分木に含まれるノードには操作を行わない)

# 2. クエリを全て処理したあと、深さ優先順に各ノードvのカウンタを以下のように更新する

# count[v] = count[v] + 親ノードのカウンタ

# 毎回部分木に対して処理を行うのだとO(N^2)の計算量となり遅いので、上記のように工夫して更新する





def bfs(v, parent):

    for v_adj in graph[v]:

        if v_adj == parent:

            continue

        count[v_adj] += count[v]

        bfs(v_adj, v)





count = [0] * N

for p, x in query:

    count[p] += x

# pprint(count)



v = 0

bfs(0, -1)



print((*count))

#!/usr/bin/env python3
import sys

sys.setrecursionlimit(10**6)
input = sys.stdin.buffer.readline
n_nodes, q_query = list(map(int, input().split()))
edges = [[] for _ in range(n_nodes)]
for _ in range(n_nodes - 1):
    a, b = list(map(int, input().split()))
    edges[a - 1].append(b - 1)
    edges[b - 1].append(a - 1)
queries = []
for _ in range(q_query):
    p, x = list(map(int, input().split()))
    queries.append([p - 1, x])
# print(n_nodes, q_query)
# print(edges, queries)
res = [0 for _ in range(n_nodes)]
for node, point in queries:
    res[node] += point


def dfs(v, parent):
    for v_next in edges[v]:
        if v_next != parent:
            res[v_next] += res[v]
            dfs(v_next, v)


dfs(0, None)
print((*res))

#!/usr/bin/env python3
from pprint import pprint
import sys

sys.setrecursionlimit(10**6)
input = sys.stdin.buffer.readline
INF = float("inf")
N, Q = list(map(int, input().split()))
graph = [[] for _ in range(N)]
for _ in range(N - 1):
    u, v = list(map(int, input().split()))
    # undirected, 0-indexed
    graph[u - 1].append(v - 1)
    graph[v - 1].append(u - 1)
query = []
for _ in range(Q):
    p, x = list(map(int, input().split()))
    query.append([p - 1, x])
# 方針
# 1. 各クエリに対し、頂点p_jのカウンターにx_jを足す
# (この段階では部分木に含まれるノードには操作を行わない)
# 2. クエリを全て処理したあと、深さ優先順に各ノードvのカウンタを以下のように更新する
# count[v] = count[v] + 親ノードのカウンタ
# 毎回部分木に対して処理を行うのだとO(N^2)の計算量となり遅いので、上記のように工夫して更新する
def bfs(v, parent):
    for v_adj in graph[v]:
        if v_adj == parent:
            continue
        count[v_adj] += count[v]
        bfs(v_adj, v)


count = [0] * N
for p, x in query:
    count[p] += x
# pprint(count)
v = 0
bfs(0, -1)
print((*count))

+from pprint import pprint -n_nodes, q_query = list(map(int, input().split())) -edges = [[] for _ in range(n_nodes)] -for _ in range(n_nodes - 1): -    a, b = list(map(int, input().split())) -    edges[a - 1].append(b - 1) -    edges[b - 1].append(a - 1) -queries = [] -for _ in range(q_query): +INF = float("inf") +N, Q = list(map(int, input().split())) +graph = [[] for _ in range(N)] +for _ in range(N - 1): +    u, v = list(map(int, input().split())) +    # undirected, 0-indexed +    graph[u - 1].append(v - 1) +    graph[v - 1].append(u - 1) +query = [] +for _ in range(Q): -    queries.append([p - 1, x]) -# print(n_nodes, q_query) -# print(edges, queries) -res = [0 for _ in range(n_nodes)] -for node, point in queries: -    res[node] += point +    query.append([p - 1, x]) +# 方針 +# 1. 各クエリに対し、頂点p_jのカウンターにx_jを足す +# (この段階では部分木に含まれるノードには操作を行わない) +# 2. クエリを全て処理したあと、深さ優先順に各ノードvのカウンタを以下のように更新する +# count[v] = count[v] + 親ノードのカウンタ +# 毎回部分木に対して処理を行うのだとO(N^2)の計算量となり遅いので、上記のように工夫して更新する +def bfs(v, parent): +    for v_adj in graph[v]: +        if v_adj == parent: +            continue +        count[v_adj] += count[v] +        bfs(v_adj, v) -def dfs(v, parent): -    for v_next in edges[v]: -        if v_next != parent: -            res[v_next] += res[v] -            dfs(v_next, v) - - -dfs(0, None) -print((*res)) +count = [0] * N +for p, x in query: +    count[p] += x +# pprint(count) +v = 0 +bfs(0, -1) +print((*count))