Language: C++

#include <bits/stdc++.h>
using namespace std;
#define  rep(i, n) for(int i = 0; i < n; i++) 
#define  all(x) (x).begin(),(x).end()     // 昇順ソート
#define  rall(v) (v).rbegin(), (v).rend() // 降順ソート
#define  INF 1LL << 60
typedef long long int LL;
const int MOD = 1000000007;
template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return true; } return false; }
//sort(all(x))とするとソートできるよ
// 10^x は pow(10,(x)) 
// 任意のlogは　対数の底の変換を使う    log(N) / log(任意の底)

int NIL = -1;

struct Node {
    int parent;     //・節点 u の親ノード
    int left;       //・節点 u の最も左の子(left)
    int right;      //・節点 u のすぐ右の兄弟(right)
    int end;        //・節点 u 子の一番右の兄弟
}node;

vector<struct Node> T;  // ノード入れ

void GetChildren(int u,vector<vector<int>> &CL){    // CLが子のリスト
    int c;
    if(T[u].left != NIL)c = T[u].left;
    else return;
    while(c != NIL){
        CL[u].push_back(c); 
        c = T[c].right;
    }
    return;
}

void GetDepth(int u,int &d){    // u は節点番号、d は深さ
    d = 0
    while(T[u].parent != NIL){  // T[u]には　節点番号u　が持つ親、左の子、右の兄弟の情報が入っているので、
        u = T[u].parent;        // 親を参照し続けて自らを親に更新して木を上り続ける。
        d++;                    // d は参照渡ししているので、呼び出し元のdにそのまま更新される。
    }
    return;
}

///////////////////////////////// O(N)　のはず

int main(){
    int N,Q;cin >> N >> Q;
    T.resize(N+1);

    rep(i,N+1)T[i].parent = T[i].left = T[i].right = NIL; // 初期化

    int tmp1,tmp2; // tmp1 は親、tmp2　は追加される子

    rep(i,N-1){     //  ノードの入力
        cin >> tmp1 >> tmp2;
        int dep1 = 0;
        int dep2 = 0;
        GetDepth(tmp1,dep1);
        GetDepth(tmp2,dep2);
        if(dep1 < dep2)swap(tmp1,tmp2);
        if(T[tmp1].left == NIL)T[tmp1].left = T[tmp1].end = tmp2;
        else{
            int c = T[tmp1].end;
            T[c].right = tmp2;
            T[tmp1].end = tmp2;
        }
        T[tmp2].parent = tmp1;  //　親登録
    }

    vector<vector<int>> CL; //子リスト
    CL.resize(N+1);
    for(int i = 1;i < N+1;i++)GetChildren(i,CL);  //子リスト取得


    vector<LL> ct(N+1);   // カウンター配列

    int p,x;
    rep(i,Q){
        cin >> p >> x;
        ct[p] += x;
    }

    for(int i = 2;i < N+1;i++){
        ct[i] += ct[T[i].parent];
    }

    rep(i,N)cout << ct[i+1] << " ";

} 


//　答えはあってるけど　TLE
// TLE 解消

// TLE の原因は47行目から始まるノード入力の際に、T[c].rightの右隣りを.rightでwhlieループで無理やり探索し続けたことだった、
// なので、rightの末端をメモするために、・子の右端にあるノード　を　.end として構造体に追加した。
// これを利用することで、そもそもwhile ループを使わなくて済むようになりAC。

// 以下に用済みになった者たちを記す。

// 70行目の最後の累積和のところ。
// 下のは子のリストをループすることで作ってる。
// しかし、純粋に親の内容を足し続けるのと同じなので、簡便をとるのとなんとなく二重ループが嫌なので上のように表記。
// こっちでもACできた。そして、3msくらいこっちのほうが早かった！？
/*
    for(int i = 1;i < N+1;i++){
        for(auto j : CL[i]){
            ct[j] += ct[i];
        }
    }
*/


// TLE の原因となったループ。
// 47行目から始まるノード入力の途中。
/*
            while(true){
                if(T[c].right == NIL){
                    T[c].right = tmp2;
                    break;
                }
                else{
                    c = T[c].right;
                }
            }
*/

Compiler output:
a.cc: In function 'void GetDepth(int, int&)':
a.cc:38:10: error: expected ';' before 'while'
   38 |     d = 0
      |          ^
      |          ;
   39 |     while(T[u].parent != NIL){  // T[u]には　節点番号u　が持つ親、左の子、右の兄弟の情報が入っているので、
      |     ~~~~~