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 1011const mod46 = 1_000_000_00912 13var fib46 []int14 15type pair46 struct{ s, t int }16 17type seg46 []struct {18 l, r, sum int19 todo pair4620}21 22func (t seg46) apply(o int, f pair46) {23 cur := &t[o]24 sz := cur.r - cur.l + 125 cur.sum = (cur.sum + fib46[sz]*f.s + (fib46[sz+1]-1)*f.t) % mod4626 cur.todo.s = (cur.todo.s + f.s) % mod4627 cur.todo.t = (cur.todo.t + f.t) % mod4628}29 30func (t seg46) maintain(o int) {31 t[o].sum = (t[o<<1].sum + t[o<<1|1].sum) % mod46 32}33 34func (t seg46) spread(o int) {35 f := t[o].todo36 if f == (pair46{}) {37 return38 }39 t.apply(o<<1, f)40 lsz := t[o<<1].r - t[o<<1].l + 141 42 t.apply(o<<1|1, pair46{(fib46[lsz-1]*f.s + fib46[lsz]*f.t) % mod46, (fib46[lsz]*f.s + fib46[lsz+1]*f.t) % mod46})43 t[o].todo = pair46{}44}45 46func (t seg46) build(in io.Reader, o, l, r int) {47 t[o].l, t[o].r = l, r48 if l == r {49 Fscan(in, &t[o].sum)50 return51 }52 m := (l + r) >> 153 t.build(in, o<<1, l, m)54 t.build(in, o<<1|1, m+1, r)55 t.maintain(o)56}57 58func (t seg46) update(o, l, r int) {59 if l <= t[o].l && t[o].r <= r {60 t.apply(o, pair46{fib46[t[o].l-l+1], fib46[t[o].l-l+2]})61 return62 }63 t.spread(o)64 m := (t[o].l + t[o].r) >> 165 if l <= m {66 t.update(o<<1, l, r)67 }68 if m < r {69 t.update(o<<1|1, l, r)70 }71 t.maintain(o)72}73 74func (t seg46) query(o, l, r int) int {75 if l <= t[o].l && t[o].r <= r {76 return t[o].sum77 }78 t.spread(o)79 m := (t[o].l + t[o].r) >> 180 if r <= m {81 return t.query(o<<1, l, r)82 }83 if l > m {84 return t.query(o<<1|1, l, r)85 }86 return t.query(o<<1, l, r) + t.query(o<<1|1, l, r)87}88 89func cf446C(in io.Reader, _w io.Writer) {90 out := bufio.NewWriter(_w)91 defer out.Flush()92 var n, m, op, l, r int93 Fscan(in, &n, &m)94 fib46 = make([]int, n+2)95 fib46[1] = 196 for i := 2; i < len(fib46); i++ {97 fib46[i] = (fib46[i-1] + fib46[i-2]) % mod4698 }99 100 t := make(seg46, 2<<bits.Len(uint(n-1)))101 t.build(in, 1, 0, n-1)102 103 for range m {104 Fscan(in, &op, &l, &r)105 l--106 r--107 if op == 1 {108 t.update(1, l, r)109 } else {110 Fprintln(out, t.query(1, l, r)%mod46)111 }112 }113}114 115116