### BUGGY CODE ###

import sys
from io import StringIO
import unittest
import os

# 検索用タグ、累積和、木、クエリ処理、遅延評価

sys.setrecursionlimit(1000000)


def dfs(me, relations, counters, arrived, ans):
    # 再帰処理
    for target in relations[me]:
        # 到達済みなら何もしない
        if arrived[target]:
            continue

        arrived[target] = True
        # 枝に設定すべき値を設定(親の値 + 加算する値)※ここがポイントかも。順次加算することで、最終的には毎回足した時と同じ値になる。
        ans[target] = ans[me] + counters[target]

        # 次の枝を処理
        dfs(target, relations, counters, arrived, ans)


# 実装を行う関数
def resolve():
    n, q = map(int, input().split())

    # 木のつながりを整理する
    relations = [[] for i in range(n + 1)]
    for i in range(n - 1):
        a, b = map(int, input().split())
        relations[a].append(b)
        relations[b].append(a)

    # どの木がきたら、いくら値を加算するか、を保持する(同じ木を何度か加算することもある)
    counters = [0 for i in range(n + 1)]
    for i in range(q):
        p, x = map(int, input().split())
        counters[p] += x

    # 通過済みかを保持するリスト
    arrived = [False for i in range(n + 1)]
    # 答えを保持するリスト
    ans = [0 for i in range(n + 1)]

    # root木の値を初期設定
    arrived[1] = True
    ans[1] = counters[1]

    # 辺のつながりを再帰的に追っていく。(ちなみに、木構造なのでループは無し)
    dfs(1, relations, counters, arrived, ans)

    # ans_list = [str(i) for i in ans[1:]]
    # print(" ".join(ans_list))
    print(*ans[1:])


# テストクラス
class TestClass(unittest.TestCase):
    def assertIO(self, assert_input, output):
        stdout, sat_in = sys.stdout, sys.stdin
        sys.stdout, sys.stdin = StringIO(), StringIO(assert_input)
        resolve()
        sys.stdout.seek(0)
        out = sys.stdout.read()[:-1]
        sys.stdout, sys.stdin = stdout, sat_in
        self.assertEqual(out, output)

    def test_input_1(self):
        test_input = """4 3
1 2
2 3
2 4
2 10
1 100
3 1"""
        output = """100 110 111 110"""
        self.assertIO(test_input, output)

    def test_input_2(self):
        test_input = """6 2
1 2
1 3
2 4
3 6
2 5
1 10
1 10"""
        output = """20 20 20 20 20 20"""
        self.assertIO(test_input, output)

    # 自作テストパターンのひな形(利用時は「tes_t」のアンダーバーを削除すること
    def tes_t_1original_1(self):
        test_input = """データ"""
        output = """データ"""
        self.assertIO(test_input, output)


# 実装orテストの呼び出し
if __name__ == "__main__":
    if os.environ.get("USERNAME") is None:
        # AtCoder提出時の場合
        resolve()

    else:
        # 自PCの場合
        unittest.main()


### FIXED CODE ###

import sys
from io import StringIO
import unittest
import os
from collections import deque

# 検索用タグ、累積和、木、クエリ処理、遅延評価

relations = []


# 実装を行う関数
def resolve():
    global relations

    n, q = map(int, input().split())

    # 木のつながりを整理する
    relations = [[] for i in range(n + 1)]
    for i in range(n - 1):
        a, b = map(int, input().split())
        relations[a].append(b)
        relations[b].append(a)

    # どの木がきたら、いくら値を加算するか、を保持する(同じ木を何度か加算することもある)
    # 最終的に、これと「木のつながり」を組み合わせて各枝の累積和を求める。
    counters = [0 for i in range(n + 1)]
    for i in range(q):
        p, x = map(int, input().split())
        counters[p] += x

    # queを作成
    que = deque()
    que.append([1, 1])  # 初期値：スタート地点

    # BFS開始
    while len(que) is not 0:

        a = que.pop()
        now = a[0]
        bef = a[1]

        if not now == bef == 1:
            counters[now] += counters[bef]

        # 再帰処理のためのループ
        for target in relations[now]:

            if target == bef:
                continue

            que.appendleft([target, now])

    print(*counters[1:])


# テストクラス
class TestClass(unittest.TestCase):
    def assertIO(self, assert_input, output):
        stdout, sat_in = sys.stdout, sys.stdin
        sys.stdout, sys.stdin = StringIO(), StringIO(assert_input)
        resolve()
        sys.stdout.seek(0)
        out = sys.stdout.read()[:-1]
        sys.stdout, sys.stdin = stdout, sat_in
        self.assertEqual(out, output)

    def test_input_1(self):
        test_input = """4 3
1 2
2 3
2 4
2 10
1 100
3 1"""
        output = """100 110 111 110"""
        self.assertIO(test_input, output)

    def test_input_2(self):
        test_input = """6 2
1 2
1 3
2 4
3 6
2 5
1 10
1 10"""
        output = """20 20 20 20 20 20"""
        self.assertIO(test_input, output)

    # 自作テストパターンのひな形(利用時は「tes_t」のアンダーバーを削除すること
    def tes_t_1original_1(self):
        test_input = """データ"""
        output = """データ"""
        self.assertIO(test_input, output)


# 実装orテストの呼び出し
if __name__ == "__main__":
    if os.environ.get("USERNAME") is None:
        # AtCoder提出時の場合
        resolve()

    else:
        # 自PCの場合
        unittest.main()