Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910const mod18 int64 = 1e9 + 711 12type matrix18 [2][2]int6413 14var id18 = matrix18{{1, 0}, {0, 1}}15var trans18 = matrix18{{1, 1}, {1, 0}}16var base18 = matrix18{{0, 0}, {1, 0}}17 18func (a matrix18) add(b matrix18) matrix18 {19 for i, r := range a {20 for j, v := range r {21 b[i][j] = (b[i][j] + v) % mod1822 }23 }24 return b25}26 27func (a matrix18) mul(b matrix18) (c matrix18) {28 for i, r := range a {29 for j := range b[0] {30 for k, v := range r {31 c[i][j] = (c[i][j] + v*b[k][j]) % mod1832 }33 }34 }35 return c36}37 38func (a matrix18) pow(n int) matrix18 {39 res := id1840 for ; n > 0; n >>= 1 {41 if n&1 > 0 {42 res = res.mul(a)43 }44 a = a.mul(a)45 }46 return res47}48 49type seg18 []struct {50 l, r int51 todo matrix1852 sum matrix1853}54 55func (t seg18) maintain(o int) {56 lo, ro := t[o<<1], t[o<<1|1]57 t[o].sum = lo.sum.add(ro.sum)58}59 60func (t seg18) build(a []int, o, l, r int) {61 t[o].l, t[o].r, t[o].todo = l, r, id1862 if l == r {63 t[o].sum = trans18.pow(a[l-1]).mul(base18)64 return65 }66 m := (l + r) >> 167 t.build(a, o<<1, l, m)68 t.build(a, o<<1|1, m+1, r)69 t.maintain(o)70}71 72func (t seg18) do(o int, m matrix18) {73 to := &t[o]74 to.todo = m.mul(to.todo)75 to.sum = m.mul(to.sum)76}77 78func (t seg18) spread(o int) {79 if m := t[o].todo; m != id18 {80 t.do(o<<1, m)81 t.do(o<<1|1, m)82 t[o].todo = id1883 }84}85 86func (t seg18) update(o, l, r int, mat matrix18) {87 if l <= t[o].l && t[o].r <= r {88 t.do(o, mat)89 return90 }91 t.spread(o)92 m := (t[o].l + t[o].r) >> 193 if l <= m {94 t.update(o<<1, l, r, mat)95 }96 if m < r {97 t.update(o<<1|1, l, r, mat)98 }99 t.maintain(o)100}101 102func (t seg18) query(o, l, r int) int64 {103 if l <= t[o].l && t[o].r <= r {104 return t[o].sum[0][0]105 }106 t.spread(o)107 m := (t[o].l + t[o].r) >> 1108 if r <= m {109 return t.query(o<<1, l, r)110 }111 if m < l {112 return t.query(o<<1|1, l, r)113 }114 return (t.query(o<<1, l, r) + t.query(o<<1|1, l, r)) % mod18115}116 117func CF718C(_r io.Reader, _w io.Writer) {118 in := bufio.NewReader(_r)119 out := bufio.NewWriter(_w)120 defer out.Flush()121 122 var n, q, op, l, r, x int123 Fscan(in, &n, &q)124 a := make([]int, n)125 for i := range a {126 Fscan(in, &a[i])127 }128 t := make(seg18, n*4)129 t.build(a, 1, 1, n)130 for ; q > 0; q-- {131 if Fscan(in, &op, &l, &r); op == 1 {132 Fscan(in, &x)133 t.update(1, l, r, trans18.pow(x))134 } else {135 Fprintln(out, t.query(1, l, r))136 }137 }138}139 140141