#include <bits/stdc++.h>
#include <boost/range/adaptors.hpp>
#include <boost/multiprecision/cpp_int.hpp>

using namespace std;
using ll = long long;
using ld = long double;
using ml = boost::multiprecision::cpp_int;

namespace NyaGadget
{
	/*** DFSライブラリ***/

#define fori(i, ...) if(ll i = -1) for(__VA_ARGS__) if(i++, true)
#define each(i, e, v) fori(i, auto& e: v)

	struct DFSnode
	{	// DFS NODE
		ll r = 0;  // root node
		ll s = 0;  // self node
	};

	struct DepthFirstSearchSample
	{	// この構造体は一例なので、新しく定義してライブラリを使うこと。
		vector<ll> ans;
	};

	void DepthFirstSearchTest(DFSnode n, DepthFirstSearchSample& v)
	{	// これはテスト関数なので、新しく定義すること。
		v.ans[n.s] = v.ans[n.r] + 1;
	}

	struct DFS
	{
		using Edge = vector<ll>;
		vector<Edge> graph;

		DFS(ll size) { graph.resize(size); }
		vector<ll>& operator [](int n) { return graph[n]; }

		/**
		@brief 辺を追加する関数
		@note
		 頂点v1とv2を結ぶ辺を追加する。
		**/
		void CreateEdge(ll v1, ll v2)
		{	// 後戻りも出来るようにv1→v2とv2→v1の両方の辺を追加する
			graph[v1].push_back(v2);
			graph[v2].push_back(v1);
		}

		/**
		@brief 実行関数
		@param snode 開始ノード
		@param v 各ノード処理に必要な変数
		@param Update ノード毎の処理を定義した関数
		@note
		 大抵の場合、開始ノードは{0, 0}で良い。
		 Updateの処理で必要な変数はvで渡す。
		 したがって、Updateの第二引数と変数vは同じ型にする必要がある。
		**/
		template <class T> void
		Run(DFSnode snode, T& v, function<void(DFSnode, T&)> Update)
		{
			Update(snode, v);

			each(i, e, graph[snode.s])
			{	// 後戻りしないようにする
				if (e == snode.r)
					continue;

				Run<T>({snode.s, e}, v, Update);
			}
		}
	};

#undef fori
#undef each

}

#define all(collection) (collection).begin(), (collection).end()              // begin to end
#define divc(a, b) ceil((ld) a / (ld) b);                                     // div ceiling
#define rep(i, begin, end) for (ll i = begin; i < end; i++)                   // repeat
#define repr(i, begin, end) for (ll i = begin; end < i; i--)                  // repeat reverse
#define size(collection) ((ll) (collection).size())                           // collection size
#define sum(begin, end) accumulate(all(begin, end), 0LL)                      // accumulate 
/********** const value **********/
#define llong_max 9223372036854775807                                         // 9 * 10^18
#define mod 1000000007                                                        // 1e9 + 7
#define pi 3.14159265                                                         // 3.14 ...
/********** for each macro **********/
#define fori(i, ...) if(ll i = -1) for(__VA_ARGS__) if(i++, true)
#define each(i, e, v) fori(i, auto& e: v)
#define forir(i, ...) if(ll i = size(v)) for(__VA_ARGS__) if(i--, true)
#define eachr(i, e, v) forir(i, auto& e: boost::adaptors::reverse(v))

using namespace NyaGadget;

struct DFSV
{
	vector<ll> ans;
	vector<ll> memo;
};

void DFSF(DFSnode n, DFSV& v)
{
	v.ans[n.s] = v.ans[n.r] + v.memo[n.s];
}

int main(void)
{ 
	ll n, q; cin >> n >> q;

	DFS dfs(n);
	rep(i, 0, n - 1)
	{
		ll a, b; cin >> a >> b;
		dfs.CreateEdge(--a, --b);
	}

	vector<ll> p(q), x(q);
	rep(i, 0, q)
	{
		cin >> p[i] >> x[i];
		p[i]--;
	}

	// 頂点xで加算するべきカウンタの値をメモしておく。
	DFSV v = { vector<ll>(n), vector<ll>(n) };
	rep(i, 0, q)
		v.memo[p[i]] += x[i];
	// DFSを実行する
	dfs.Run<DFSV>({0, 0}, v, DFSF);

	each(i, e, v.ans)
		cout << e << " ";

	return 0;
}


Measured memory_bytes: 35712