Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math/bits"8)9 1011func CF1304E(_r io.Reader, _w io.Writer) {12 in := bufio.NewReader(_r)13 out := bufio.NewWriter(_w)14 defer out.Flush()15 16 var n, q, v, w, x, y, a, b, k int17 Fscan(in, &n)18 g := make([][]int, n)19 for i := 0; i < n-1; i++ {20 Fscan(in, &v, &w)21 v--22 w--23 g[v] = append(g[v], w)24 g[w] = append(g[w], v)25 }26 vs := make([]int, 0, 2*n-1)27 pos := make([]int, n)28 depths := make([]int, 0, 2*n-1)29 dis := make([]int, n)30 var dfs func(v, fa, d int)31 dfs = func(v, fa, d int) {32 pos[v] = len(vs)33 vs = append(vs, v)34 depths = append(depths, d)35 dis[v] = d36 for _, w := range g[v] {37 if w != fa {38 dfs(w, v, d+1)39 vs = append(vs, v)40 depths = append(depths, d)41 }42 }43 }44 dfs(0, -1, 0)45 type pair struct{ v, i int }46 var st [][18]pair47 stInit := func(a []int) {48 n := len(a)49 st = make([][18]pair, n)50 for i := range st {51 st[i][0] = pair{a[i], i}52 }53 for j := uint(1); 1<<j <= n; j++ {54 for i := 0; i+(1<<j)-1 < n; i++ {55 st0, st1 := st[i][j-1], st[i+(1<<(j-1))][j-1]56 if st0.v < st1.v {57 st[i][j] = st058 } else {59 st[i][j] = st160 }61 }62 }63 }64 stInit(depths)65 stQuery := func(l, r int) int {66 k := uint(bits.Len(uint(r-l+1)) - 1)67 st0, st1 := st[l][k], st[r-(1<<k)+1][k]68 if st0.v < st1.v {69 return st0.i70 }71 return st1.i72 }73 lca := func(v, w int) int {74 pv, pw := pos[v], pos[w]75 if pv > pw {76 pv, pw = pw, pv77 }78 return vs[stQuery(pv, pw)]79 }80 _d := func(v, w int) int { return dis[v] + dis[w] - dis[lca(v, w)]<<1 }81 82_q:83 for Fscan(in, &q); q > 0; q-- {84 Fscan(in, &x, &y, &a, &b, &k)85 x--86 y--87 a--88 b--89 for _, d := range []int{_d(a, b), _d(a, x) + _d(b, y) + 1, _d(a, y) + _d(b, x) + 1} {90 if d <= k && d&1 == k&1 {91 Fprintln(out, "YES")92 continue _q93 }94 }95 Fprintln(out, "NO")96 }97}98 99100