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 1112const mod11 = 9554272113const period11 = 4814 15func rotateLeft(a []int, k int) {16 Reverse(a[:k])17 Reverse(a[k:])18 Reverse(a)19}20 21type seg11 []struct {22 l, r int23 sum [period11]int24 todo int25}26 27func (t seg11) apply(o, f int) {28 rotateLeft(t[o].sum[:], f%period11)29 t[o].todo += f30}31 32func (t seg11) maintain(o int) {33 for i := range period11 {34 t[o].sum[i] = (t[o<<1].sum[i] + t[o<<1|1].sum[i]) % mod1135 }36}37 38func (t seg11) spread(o int) {39 f := t[o].todo40 if f == 0 {41 return42 }43 t.apply(o<<1, f)44 t.apply(o<<1|1, f)45 t[o].todo = 046}47 48func (t seg11) build(in io.Reader, o, l, r int) {49 t[o].l, t[o].r = l, r50 if l == r {51 var x int52 Fscan(in, &x)53 s := &t[o].sum54 s[0] = x55 for i := 1; i < period11; i++ {56 x = x * x % mod11 * x % mod1157 s[i] = x58 }59 return60 }61 m := (l + r) >> 162 t.build(in, o<<1, l, m)63 t.build(in, o<<1|1, m+1, r)64 t.maintain(o)65}66 67func (t seg11) update(o, l, r int) {68 if l <= t[o].l && t[o].r <= r {69 t.apply(o, 1)70 return71 }72 t.spread(o)73 m := (t[o].l + t[o].r) >> 174 if l <= m {75 t.update(o<<1, l, r)76 }77 if m < r {78 t.update(o<<1|1, l, r)79 }80 t.maintain(o)81}82 83func (t seg11) query(o, l, r int) int {84 if l <= t[o].l && t[o].r <= r {85 return t[o].sum[0]86 }87 t.spread(o)88 m := (t[o].l + t[o].r) >> 189 if r <= m {90 return t.query(o<<1, l, r)91 }92 if l > m {93 return t.query(o<<1|1, l, r)94 }95 return t.query(o<<1, l, r) + t.query(o<<1|1, l, r)96}97 98func cf311D(in io.Reader, _w io.Writer) {99 out := bufio.NewWriter(_w)100 defer out.Flush()101 var n, q, op, l, r int102 Fscan(in, &n)103 t := make(seg11, 2<<bits.Len(uint(n-1)))104 t.build(in, 1, 1, n)105 Fscan(in, &q)106 for range q {107 Fscan(in, &op, &l, &r)108 if op == 1 {109 Fprintln(out, t.query(1, l, r)%mod11)110 } else {111 t.update(1, l, r)112 }113 }114}115 116117