Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math/bits"8 "slices"9)10 1112func cf601E(in io.Reader, _w io.Writer) {13 const mod = 1_000_000_00714 out := bufio.NewWriter(_w)15 defer out.Flush()16 var n, k, q, t, op, v, w int17 Fscan(in, &n, &k)18 type pair struct{ v, w int }19 a := make([]pair, n)20 type lr struct{ l, r int }21 ranges := make([]lr, n)22 for i := range a {23 Fscan(in, &a[i].v, &a[i].w)24 ranges[i].r = -125 }26 27 Fscan(in, &q)28 for range q {29 Fscan(in, &op)30 if op == 1 {31 Fscan(in, &v, &w)32 a = append(a, pair{v, w})33 ranges = append(ranges, lr{t, -1})34 } else if op == 2 {35 Fscan(in, &v)36 ranges[v-1].r = t37 } else {38 t++39 }40 }41 42 g := make([][]pair, 2<<bits.Len(uint(t-1))) 43 var update func(o, l, r, ql, qr int, p pair)44 update = func(o, l, r, ql, qr int, p pair) {45 if ql <= l && r <= qr {46 g[o] = append(g[o], p)47 return48 }49 m := (l + r) / 250 if ql <= m {51 update(o*2, l, m, ql, qr, p)52 }53 if m < qr {54 update(o*2+1, m+1, r, ql, qr, p)55 }56 }57 for i, p := range ranges {58 if p.r < 0 {59 p.r = t60 }61 if p.l < p.r {62 update(1, 0, t-1, p.l, p.r-1, a[i])63 }64 }65 66 var dfs func(o, l, r int, f []int)67 dfs = func(o, l, r int, f []int) {68 if g[o] != nil {69 f = slices.Clone(f)70 for _, p := range g[o] {71 for i := k; i >= p.w; i-- {72 f[i] = max(f[i], f[i-p.w]+p.v)73 }74 }75 }76 if l == r {77 ans, powP := 0, 178 for _, v := range f[1:] {79 ans = (ans + v*powP) % mod80 powP = powP * 10_000_019 % mod81 }82 Fprintln(out, ans)83 return84 }85 m := (l + r) / 286 dfs(o*2, l, m, f)87 dfs(o*2+1, m+1, r, f)88 }89 dfs(1, 0, t-1, make([]int, k+1))90}91 9293