atcoder ABC138 D - Ki

atcoder.jp

・参考:
AtCoder ABC 138 D - Ki (緑色, 400 点) - けんちょんの競プロ精進記録

Submission #7012551 - AtCoder Beginner Contest 138


・説明:いもす法を木でやれば良い。いもす法については
いもす法 - いもす研 (imos laboratory)
を参考。
注意として途中でlru_cacheを使っているが使わないほうがはやい。

import sys
sys.setrecursionlimit(10**6)   #再帰関数の上限を上げる
#from functools import lru_cache   #メモ化再帰で高速化

n,q=map(int,input().split())
G=[[] for _ in range(n)]
for _ in range(n-1):
  a,b=map(int,input().split())
  a-=1
  b-=1
  G[a].append(b)
  G[b].append(a)

ans=[0 for _ in range(n)]

#@lru_cache(maxsize=1000)
def dfs (v,bv=-1):   #vが今の頂点、bvが前の頂点、はじめは-1。
  for nv in G[v]:
    if nv==bv:    #前の頂点と次の頂点が同じ、つまり無限ループしたらスルー。
      continue
    ans[nv]+=ans[v]   #いもす法
    dfs(nv,v)

for i in range(q):
  p,x=map(int,input().split())
  p-=1
  ans[p]+=x   #いもす法
  
dfs(0) 
print(*ans)