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 seg10 []struct{ l, r, min, todo int }12 13func (t seg10) do(o, v int) {14 t[o].min += v15 t[o].todo += v16}17 18func (t seg10) spread(o int) {19 if v := t[o].todo; v != 0 {20 t.do(o<<1, v)21 t.do(o<<1|1, v)22 t[o].todo = 023 }24}25 26func (t seg10) build(a []int, o, l, r int) {27 t[o].l, t[o].r = l, r28 if l == r {29 t[o].min = a[l-1]30 return31 }32 m := (l + r) >> 133 t.build(a, o<<1, l, m)34 t.build(a, o<<1|1, m+1, r)35 t.maintain(o)36}37 38func (t seg10) update(o, l, r, v int) {39 if l <= t[o].l && t[o].r <= r {40 t.do(o, v)41 return42 }43 t.spread(o)44 m := (t[o].l + t[o].r) >> 145 if l <= m {46 t.update(o<<1, l, r, v)47 }48 if m < r {49 t.update(o<<1|1, l, r, v)50 }51 t.maintain(o)52}53 54func (t seg10) maintain(o int) {55 t[o].min = min(t[o<<1].min, t[o<<1|1].min)56}57 58func (t seg10) query(o, l, r int) int {59 if l <= t[o].l && t[o].r <= r {60 return t[o].min61 }62 t.spread(o)63 m := (t[o].l + t[o].r) >> 164 if r <= m {65 return t.query(o<<1, l, r)66 }67 if l > m {68 return t.query(o<<1|1, l, r)69 }70 return min(t.query(o<<1, l, r), t.query(o<<1|1, l, r))71}72 73func cf1110F(_r io.Reader, _w io.Writer) {74 in := bufio.NewReader(_r)75 out := bufio.NewWriter(_w)76 defer out.Flush()77 78 var n, q, dfn int79 Fscan(in, &n, &q)80 type pair struct{ to, wt int }81 g := make([][]pair, n)82 for w := 1; w < n; w++ {83 var v, wt int84 Fscan(in, &v, &wt)85 g[v-1] = append(g[v-1], pair{w, wt})86 }87 a := make([]int, n)88 nodes := make([]struct{ l, r int }, n)89 var build func(int, int) int90 build = func(v, d int) (size int) {91 if g[v] == nil {92 a[dfn] = d93 } else {94 a[dfn] = 1e1895 }96 dfn++97 nodes[v].l = dfn98 for _, e := range g[v] {99 size += build(e.to, d+e.wt)100 }101 nodes[v].r = nodes[v].l + size102 size++103 return104 }105 build(0, 0)106 107 t := make(seg10, 2<<bits.Len(uint(n-1)))108 t.build(a, 1, 1, n)109 type query struct{ l, r, i int }110 qs := make([][]query, n)111 for i := 0; i < q; i++ {112 var v, l, r int113 Fscan(in, &v, &l, &r)114 qs[v-1] = append(qs[v-1], query{l, r, i})115 }116 ans := make([]int, q)117 var f func(int)118 f = func(v int) {119 for _, q := range qs[v] {120 ans[q.i] = t.query(1, q.l, q.r)121 }122 for _, e := range g[v] {123 p := nodes[e.to]124 t.update(1, 1, n, e.wt)125 t.update(1, p.l, p.r, -e.wt*2)126 f(e.to)127 t.update(1, 1, n, -e.wt)128 t.update(1, p.l, p.r, e.wt*2)129 }130 }131 f(0)132 for _, v := range ans {133 Fprintln(out, v)134 }135}136 137138