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 1011type seg43 []struct{ l, r, val, todo int }12 13func (t seg43) do(o, v int) {14 t[o].val = v15 t[o].todo = v16}17 18func (t seg43) spread(o int) {19 if v := t[o].todo; v != -1 {20 t.do(o<<1, v)21 t.do(o<<1|1, v)22 t[o].todo = -123 }24}25 26func (t seg43) build(o, l, r int) {27 t[o].l, t[o].r = l, r28 t[o].todo = -129 if l == r {30 return31 }32 m := (l + r) >> 133 t.build(o<<1, l, m)34 t.build(o<<1|1, m+1, r)35}36 37func (t seg43) update(o, l, r, v int) {38 if l <= t[o].l && t[o].r <= r {39 t.do(o, v)40 return41 }42 t.spread(o)43 m := (t[o].l + t[o].r) >> 144 if l <= m {45 t.update(o<<1, l, r, v)46 }47 if m < r {48 t.update(o<<1|1, l, r, v)49 }50}51 52func (t seg43) query(o, i int) int {53 if t[o].l == t[o].r {54 return t[o].val55 }56 t.spread(o)57 m := (t[o].l + t[o].r) >> 158 if i <= m {59 return t.query(o<<1, i)60 }61 return t.query(o<<1|1, i)62}63 64func cf343D(_r io.Reader, _w io.Writer) {65 in := bufio.NewReader(_r)66 out := bufio.NewWriter(_w)67 defer out.Flush()68 69 var n, v, w, dfn, q, op int70 Fscan(in, &n)71 g := make([][]int, n)72 for i := 1; i < n; i++ {73 Fscan(in, &v, &w)74 v--75 w--76 g[v] = append(g[v], w)77 g[w] = append(g[w], v)78 }79 80 type node struct{ depth, size, hson, fa, top, dfn int }81 nodes := make([]node, n)82 var build func(int, int, int) int83 build = func(v, fa, d int) int {84 size, hsz, hson := 1, 0, -185 for _, w := range g[v] {86 if w != fa {87 sz := build(w, v, d+1)88 size += sz89 if sz > hsz {90 hsz, hson = sz, w91 }92 }93 }94 nodes[v] = node{depth: d, size: size, hson: hson, fa: fa}95 return size96 }97 build(0, -1, 0)98 99 var markTop func(int, int)100 markTop = func(v, top int) {101 o := &nodes[v]102 o.top = top103 dfn++104 o.dfn = dfn105 if o.hson != -1 {106 markTop(o.hson, top)107 for _, w := range g[v] {108 if w != o.fa && w != o.hson {109 markTop(w, w)110 }111 }112 }113 }114 markTop(0, 0)115 116 t := make(seg43, 2<<bits.Len(uint(n-1)))117 t.build(1, 1, n)118 doPath := func(v, w int) {119 ov, ow := nodes[v], nodes[w]120 for ; ov.top != ow.top; ov, ow = nodes[v], nodes[w] {121 topv, topw := nodes[ov.top], nodes[ow.top]122 if topv.depth < topw.depth {123 v, w = w, v124 ov, ow = ow, ov125 topv, topw = topw, topv126 }127 t.update(1, topv.dfn, ov.dfn, 0)128 v = topv.fa129 }130 if ov.depth > ow.depth {131 ov, ow = ow, ov132 }133 t.update(1, ov.dfn, ow.dfn, 0)134 }135 for Fscan(in, &q); q > 0; q-- {136 Fscan(in, &op, &v)137 v--138 if op == 1 {139 o := nodes[v]140 t.update(1, o.dfn, o.dfn+o.size-1, 1)141 } else if op == 2 {142 doPath(0, v)143 } else {144 Fprintln(out, t.query(1, nodes[v].dfn))145 }146 }147}148 149150