Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math/bits"8 "sort"9)10 1112func CF1320E(_r io.Reader, _w io.Writer) {13 in := bufio.NewReader(_r)14 out := bufio.NewWriter(_w)15 defer out.Flush()16 17 var n, v, w, ts, q, k, m int18 Fscan(in, &n)19 g := make([][]int, n)20 for i := 1; i < n; i++ {21 Fscan(in, &v, &w)22 v--23 w--24 g[v] = append(g[v], w)25 g[w] = append(g[w], v)26 }27 28 const mx = 1829 pa := make([][mx]int, n)30 dep := make([]int, n)31 dfn := make([]int, n)32 var buildPa func(int, int)33 buildPa = func(v, p int) {34 dfn[v] = ts35 ts++36 pa[v][0] = p37 for _, w := range g[v] {38 if w != p {39 dep[w] = dep[v] + 140 buildPa(w, v)41 }42 }43 }44 buildPa(0, -1)45 for i := 0; i+1 < mx; i++ {46 for v := range pa {47 if p := pa[v][i]; p != -1 {48 pa[v][i+1] = pa[p][i]49 } else {50 pa[v][i+1] = -151 }52 }53 }54 uptoDep := func(v, d int) int {55 for k := dep[v] - d; k > 0; k &= k - 1 {56 v = pa[v][bits.TrailingZeros(uint(k))]57 }58 return v59 }60 getLCA := func(v, w int) int {61 if dep[v] > dep[w] {62 v, w = w, v63 }64 w = uptoDep(w, dep[v])65 if w == v {66 return v67 }68 for i := mx - 1; i >= 0; i-- {69 if pv, pw := pa[v][i], pa[w][i]; pv != pw {70 v, w = pv, pw71 }72 }73 return pa[v][0]74 }75 getDis := func(v, w int) int { return dep[v] + dep[w] - dep[getLCA(v, w)]*2 }76 77 ans := make([]int, n)78 vt := make([][]int, n)79 ord := make([]int, n)80 spd := make([]int, n)81 addVtEdge := func(v, w int) { vt[v] = append(vt[v], w) }82 st := []int{0}83 for Fscan(in, &q); q > 0; q-- {84 Fscan(in, &k, &m)85 nodes := make([]int, k, k+m)86 for i := range nodes {87 Fscan(in, &nodes[i])88 nodes[i]--89 Fscan(in, &spd[nodes[i]])90 ord[nodes[i]] = i + 191 }92 qs := make([]int, m)93 for i := range qs {94 Fscan(in, &qs[i])95 qs[i]--96 if ord[qs[i]] == 0 {97 nodes = append(nodes, qs[i])98 }99 }100 101 sort.Slice(nodes, func(i, j int) bool { return dfn[nodes[i]] < dfn[nodes[j]] })102 vt[0] = vt[0][:0]103 st = st[:1]104 for _, v := range nodes {105 if v == 0 {106 continue107 }108 vt[v] = vt[v][:0]109 lca := getLCA(st[len(st)-1], v)110 for len(st) > 1 && dfn[lca] <= dfn[st[len(st)-2]] {111 addVtEdge(st[len(st)-2], st[len(st)-1])112 st = st[:len(st)-1]113 }114 if lca != st[len(st)-1] {115 vt[lca] = vt[lca][:0]116 addVtEdge(lca, st[len(st)-1])117 st[len(st)-1] = lca118 }119 st = append(st, v)120 }121 for i := 1; i < len(st); i++ {122 addVtEdge(st[i-1], st[i])123 }124 125 var f func(int)126 f = func(v int) {127 av := -1128 minD := int(1e9)129 if ord[v] > 0 {130 av = v131 minD = 0132 }133 for _, w := range vt[v] {134 f(w)135 aw := ans[w]136 if aw < 0 {137 continue138 }139 d := (getDis(v, aw) + spd[aw] - 1) / spd[aw]140 if d < minD || d == minD && ord[aw] < ord[av] {141 minD = d142 av = aw143 }144 }145 ans[v] = av146 }147 var reroot func(int)148 reroot = func(v int) {149 av := ans[v]150 for _, w := range vt[v] {151 aw := ans[w]152 if aw < 0 {153 ans[w] = av154 } else {155 d := (getDis(w, av) + spd[av] - 1) / spd[av]156 d2 := (getDis(w, aw) + spd[aw] - 1) / spd[aw]157 if d < d2 || d == d2 && ord[av] < ord[aw] {158 ans[w] = av159 }160 }161 reroot(w)162 }163 }164 f(0)165 reroot(0)166 for _, v := range qs {167 Fprint(out, ord[ans[v]], " ")168 }169 Fprintln(out)170 for _, v := range nodes {171 ord[v] = 0172 }173 }174}175 176177