Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math"8 "math/bits"9)10 1112func CF342E(_r io.Reader, _w io.Writer) {13 in := bufio.NewReader(_r)14 out := bufio.NewWriter(_w)15 defer out.Flush()16 min := func(a, b int) int {17 if a > b {18 return b19 }20 return a21 }22 23 var n, m, op, v, w int24 Fscan(in, &n, &m)25 g := make([][]int, n)26 for i := 1; i < n; i++ {27 Fscan(in, &v, &w)28 v--29 w--30 g[v] = append(g[v], w)31 g[w] = append(g[w], v)32 }33 34 vs := make([]int, 0, 2*n-1)35 pos := make([]int, n)36 dep := make([]int, 0, 2*n-1)37 disRoot := make([]int, n)38 var build func(v, p, d int)39 build = func(v, p, d int) {40 pos[v] = len(vs)41 vs = append(vs, v)42 dep = append(dep, d)43 disRoot[v] = d44 for _, w := range g[v] {45 if w != p {46 build(w, v, d+1)47 vs = append(vs, v)48 dep = append(dep, d)49 }50 }51 }52 build(1, -1, 0)53 type stPair struct{ v, i int }54 const mx = 1855 var st [][mx]stPair56 stInit := func(a []int) {57 n := len(a)58 st = make([][mx]stPair, n)59 for i, v := range a {60 st[i][0] = stPair{v, i}61 }62 for j := 1; 1<<j <= n; j++ {63 for i := 0; i+1<<j <= n; i++ {64 if a, b := st[i][j-1], st[i+1<<(j-1)][j-1]; a.v < b.v {65 st[i][j] = a66 } else {67 st[i][j] = b68 }69 }70 }71 }72 stInit(dep)73 stQuery := func(l, r int) int {74 k := bits.Len(uint(r-l)) - 175 a, b := st[l][k], st[r-1<<k][k]76 if a.v < b.v {77 return a.i78 }79 return b.i80 }81 lca := func(v, w int) int {82 pv, pw := pos[v], pos[w]83 if pv > pw {84 pv, pw = pw, pv85 }86 return vs[stQuery(pv, pw+1)]87 }88 _d := func(v, w int) int { return disRoot[v] + disRoot[w] - disRoot[lca(v, w)]<<1 }89 90 dis := make([]int, n)91 for i := range dis {92 dis[i] = 1e993 }94 type pair struct{ v, fa int }95 q0 := make([]pair, 0, n)96 bfs := func(q []pair) {97 for _, p := range q {98 dis[p.v] = 099 }100 for len(q) > 0 {101 p := q[0]102 q = q[1:]103 v := p.v104 for _, w := range g[v] {105 if w != p.fa && dis[v]+1 < dis[w] {106 dis[w] = dis[v] + 1107 q = append(q, pair{w, v})108 }109 }110 }111 }112 bfs(append(q0, pair{0, -1}))113 114 sqSize := int(math.Sqrt(float64(m)))115 for q := q0; m > 0; m-- {116 Fscan(in, &op, &v)117 v--118 if op == 1 {119 q = append(q, pair{v, -1})120 if len(q) == sqSize {121 bfs(q)122 q = q0123 }124 } else {125 ans := dis[v]126 for _, p := range q {127 ans = min(ans, _d(v, p.v))128 }129 Fprintln(out, ans)130 }131 }132}133 134135