#include <bits/stdc++.h>
using namespace std;

#define rep(i,m,n) for(int (i)=(int)(m);i<(int)(n);i++)
#define rep2(i,m,n) for(int (i)=(int)(n)-1;i>=(int)(m);i--)
#define REP(i,n) rep(i,0,n)
#define REP2(i,n) rep2(i,0,n)
#define FOR(i,c) for(decltype((c).begin())i=(c).begin();i!=(c).end();++i)
#define all(hoge) (hoge).begin(),(hoge).end()
#define en '\n'
using ll = long long;
using ull = unsigned long long;
template <class T> using vec = vector<T>;
template <class T> using vvec = vector<vec<T>>;
typedef pair<ll, ll> P;
constexpr long long INF = 1LL << 60;
constexpr int INF_INT = 1 << 25;
constexpr long long MOD = (ll) 1e9 + 7;
//constexpr long long MOD = 998244353LL;
typedef vector<ll> Array;
typedef vector<Array> Matrix;


template<class T> inline bool chmin(T& a, T b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}
template<class T> inline bool chmax(T& a, T b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;
}

struct Edge {
	ll to, cap, rev;
	Edge(ll _to, ll _cap, ll _rev) {
	to = _to; cap = _cap; rev = _rev;
	}
};
using Edges = vector<Edge>;
using Graph = vector<Edges>;

void add_edge(Graph& G, ll from, ll to, ll cap, bool revFlag, ll revCap) {
	G[from].push_back(Edge(to, cap, (ll)G[to].size()));
	if (revFlag)G[to].push_back(Edge(from, revCap, (ll)G[from].size() - 1));
}

class HLD{
private:
	Graph& g;
	int n, root;
	vector<int> sz, par, in, out, head, rev, dep;
	void dfs_sz(int v, int p) {
		sz[v] = 1, par[v] = p;
		for (auto& e : g[v]) {
			if (e.to == p)swap(e, g[v].back());
			if (e.to == p)continue;
			dep[e.to] = dep[v] + 1;
			dfs_sz(e.to, v);
			sz[v] += sz[e.to];
			if (sz[e.to] > sz[g[v][0].to])swap(e, g[v][0]);
		}
	}
	void dfs_hld(int v, int p, int& t) {
		in[v] = t++; rev[in[v]] = v;
		for (auto e : g[v]) {
			if (e.to == p)continue;
			head[e.to] = (e.to == g[v][0].to ? head[v] : e.to);
			dfs_hld(e.to, v, t);
		}
		out[v] = t;
	}
public:
	HLD(Graph& _g, int _root = 0)
		:g(_g), n(g.size()), root(_root), sz(n), par(n, -1), head(n, -1), in(n), out(n), rev(n), dep(n, 0) {
		dfs_sz(root, -1);
		int t = 0;
		head[root] = root;
		dfs_hld(root, -1, t);
	}
	inline int get_in(int a) { return in[a]; }
	inline int get_sz(int a) { return sz[a]; }
	inline int get_rev(int a) { return rev[a]; }
	inline int get_dep(int a) { return dep[a]; }
	int lca(int a, int b) {
		for (;; b = par[head[b]]) {
			if (in[a] > in[b])swap(a, b);
			if (head[a] == head[b])return a;
		}
	}
	P subtree_query(int a) { return { in[a], out[a] }; }
	vector<P> path_query(int a, int b, bool edge = false) {
		vector<P> ret;
		for (;; b = par[head[b]]) {
			if (in[a] > in[b])swap(a, b);
			if (head[a] == head[b])break;
			ret.push_back({ in[head[b]],in[b] + 1 });
		}
		ret.push_back({ in[a] + edge,in[b] + 1 });
		return ret;
	}
};


struct LazySegmentTree {
private:
	int n;
	vector<ll> node, lazy;

public:
	LazySegmentTree(vector<ll> v) {
		int sz = (int)v.size();
		n = 1; while (n < sz) n *= 2;
		node.resize(2 * n - 1);
		lazy.resize(2 * n - 1, 0);

		for (int i = 0; i < sz; i++) node[i + n - 1] = v[i];
		for (int i = n - 2; i >= 0; i--) node[i] = node[i * 2 + 1] + node[i * 2 + 2];
	}

	// k 番目のノードについて遅延評価を行う
	void eval(int k, int l, int r) {

		// 遅延配列が空でない場合、自ノード及び子ノードへの
		// 値の伝播が起こる
		if (lazy[k] != 0) {
			node[k] += lazy[k];

			// 最下段かどうかのチェックをしよう
			// 子ノードは親ノードの 1/2 の範囲であるため、
			// 伝播させるときは半分にする
			if (r - l > 1) {
				lazy[2 * k + 1] += lazy[k] / 2;
				lazy[2 * k + 2] += lazy[k] / 2;
			}

			// 伝播が終わったので、自ノードの遅延配列を空にする
			lazy[k] = 0;
		}

		
	}

	void add(int a, int b, ll x, int k = 0, int l = 0, int r = -1) {
		if (r < 0) r = n;

		// k 番目のノードに対して遅延評価を行う
		eval(k, l, r);

		// 範囲外なら何もしない
		if (b <= l || r <= a) return;

		// 完全に被覆しているならば、遅延配列に値を入れた後に評価
		if (a <= l && r <= b) {
			lazy[k] += (r - l) * x;
			eval(k, l, r);
		}

		// そうでないならば、子ノードの値を再帰的に計算して、
		// 計算済みの値をもらってくる
		else {
			add(a, b, x, 2 * k + 1, l, (l + r) / 2);
			add(a, b, x, 2 * k + 2, (l + r) / 2, r);
			node[k] = node[2 * k + 1] + node[2 * k + 2];
		}
	}

	ll getsum(int a, int b, int k = 0, int l = 0, int r = -1) {
		if (r < 0) r = n;
		if (b <= l || r <= a) return 0;

		// 関数が呼び出されたら評価！
		eval(k, l, r);
		if (a <= l && r <= b) return node[k];
		ll vl = getsum(a, b, 2 * k + 1, l, (l + r) / 2);
		ll vr = getsum(a, b, 2 * k + 2, (l + r) / 2, r);
		return vl + vr;
	}
};

void solve(){
    ll n, q;
    cin>>n>>q;

    Graph g(n);
    REP(i,n-1){
        ll a,b;
        cin>>a>>b;
        a--;b--;
        add_edge(g,a,b,1,true,1);
    }

    HLD hld(g);
    Array v(n,0);
    LazySegmentTree seg(v);

    REP(i,q){
        ll p,x;
        cin>>p>>x;
        p--;
        P ret=hld.subtree_query(p);
        seg.add(ret.first,ret.second,x);
    }

    REP(i,n){
        cout<<seg.getsum(hld.get_in(i),hld.get_in(i)+1)<<" ";
    }
    cout<<en;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    solve();
    //ll t;cin>>t;REP(i,t) solve();

    return 0;
}


Measured memory_bytes: 44772