https://beta.atcoder.jp/contests/arc048/tasks/arc048_d自力で解けたので気持ちよかった。重軽分解や最小共通祖先等は全て貼っただけなので、実装もあまりつらくはなかった。頂点間の距離を深さを用いて分解し、変数間の依存関係をほぐすのは便利っぽい。decompositionで列のminに落とす。木の頂点$2$つが与えられて、その間の移動時間を答える。最短距離となる唯一の道を移動するのではなくて、たこやき屋に向かって一度だけより道してから向かう場合がある。木であるので、頂点$x$で道から逸れた場合、必ず頂点$x$で道に復帰しなければならない。図にすると以下のようになる。t$の場合はあるが、$x$は必ずこの道$P_{s,t}$上にある。d_{x,t}$である。$d_{v,w}$は頂点$v,w$間の距離である。$a_x$を、頂点$x$から最も近いたこやき屋への距離とする。これを、もう少し計算しやすい形に直そう。$e_x$を、頂点$x$の深さとする。e_y|$が成り立つ。ここで$s,t$の位置関係で場合分けをする。e_x$は頂点$x$のみに依存する値である。これは、木の道に関する単純な最小値queryである。decompositionにより列に関するqueryに変換できることが知られている。単純なsegment木を用いて、minを対数時間で計算可能である。$s$が$t$の子孫な場合以外も、同様の簡単な式変形により答えが求められる。