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 seg95 []struct{ l, r, min, todo int }12 13func (t seg95) do(o, v int) {14 t[o].min += v15 t[o].todo += v16}17 18func (t seg95) 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 seg95) build(o, l, r int) {27 t[o].l, t[o].r = l, r28 if l == r {29 return30 }31 m := (l + r) >> 132 t.build(o<<1, l, m)33 t.build(o<<1|1, m+1, r)34}35 36func (t seg95) update(o, l, r, v int) {37 if l <= t[o].l && t[o].r <= r {38 t.do(o, v)39 return40 }41 t.spread(o)42 m := (t[o].l + t[o].r) >> 143 if l <= m {44 t.update(o<<1, l, r, v)45 }46 if m < r {47 t.update(o<<1|1, l, r, v)48 }49 t[o].min = min(t[o<<1].min, t[o<<1|1].min)50}51 52func (t seg95) query(o, l, r int) int {53 if l <= t[o].l && t[o].r <= r {54 return t[o].min55 }56 t.spread(o)57 m := (t[o].l + t[o].r) >> 158 if r <= m {59 return t.query(o<<1, l, r)60 }61 if l > m {62 return t.query(o<<1|1, l, r)63 }64 return min(t.query(o<<1, l, r), t.query(o<<1|1, l, r))65}66 67func cf1295E(_r io.Reader, out io.Writer) {68 in := bufio.NewReader(_r)69 var n int70 Fscan(in, &n)71 t := make(seg95, 2<<bits.Len(uint(n)))72 t.build(1, 0, n)73 a := make([]struct{ v, cost int }, n)74 for i := range a {75 Fscan(in, &a[i].v)76 }77 for i := range a {78 Fscan(in, &a[i].cost)79 t.update(1, a[i].v, n, a[i].cost)80 }81 ans := int(1e18)82 for _, p := range a[:n-1] {83 t.update(1, 0, p.v-1, p.cost)84 t.update(1, p.v, n, -p.cost)85 ans = min(ans, t[1].min)86 }87 Fprint(out, ans)88}89 9091