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 mod66 = 1_000_000_00712const mx66 = 613 14var sPow66 [][mx66]int15 16type seg66 []struct {17 l, r int18 sum [mx66]int19 todo int20}21 22func (seg66) mergeInfo(a, b [mx66]int) [mx66]int {23 for i, v := range b {24 a[i] += v 25 }26 return a27}28 29func (t seg66) apply(o, x int) {30 cur := &t[o]31 for i := range mx66 {32 cur.sum[i] = x * (sPow66[cur.r][i] - sPow66[cur.l-1][i]) % mod6633 }34 cur.todo = x35}36 37func (t seg66) maintain(o int) {38 t[o].sum = t.mergeInfo(t[o<<1].sum, t[o<<1|1].sum)39}40 41func (t seg66) spread(o int) {42 f := t[o].todo43 if f < 0 {44 return45 }46 t.apply(o<<1, f)47 t.apply(o<<1|1, f)48 t[o].todo = -149}50 51func (t seg66) build(a []int, o, l, r int) {52 t[o].l, t[o].r = l, r53 t[o].todo = -154 if l == r {55 t[o].sum[0] = a[l-1]56 for i := 1; i < mx66; i++ {57 t[o].sum[i] = t[o].sum[i-1] * l % mod6658 }59 return60 }61 m := (l + r) >> 162 t.build(a, o<<1, l, m)63 t.build(a, o<<1|1, m+1, r)64 t.maintain(o)65}66 67func (t seg66) update(o, l, r, x int) {68 if l <= t[o].l && t[o].r <= r {69 t.apply(o, x)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, x)76 }77 if m < r {78 t.update(o<<1|1, l, r, x)79 }80 t.maintain(o)81}82 83func (t seg66) query(o, l, r int) [mx66]int {84 if l <= t[o].l && t[o].r <= r {85 return t[o].sum86 }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.mergeInfo(t.query(o<<1, l, r), t.query(o<<1|1, l, r))96}97 98func cf266E(in io.Reader, _w io.Writer) {99 out := bufio.NewWriter(_w)100 defer out.Flush()101 C := [mx66][mx66]int{}102 for i := range mx66 {103 C[i][0] = 1104 for j := 1; j <= i; j++ {105 C[i][j] = C[i-1][j-1] + C[i-1][j]106 }107 }108 109 var n, m, l, r, k int110 var op string111 Fscan(in, &n, &m)112 sPow66 = make([][mx66]int, n+1)113 for i := 1; i <= n; i++ {114 powI := 1115 for j := range mx66 {116 sPow66[i][j] = (sPow66[i-1][j] + powI) % mod66117 powI = powI * i % mod66118 }119 }120 121 a := make([]int, n)122 for i := range a {123 Fscan(in, &a[i])124 }125 t := make(seg66, 2<<bits.Len(uint(n)))126 t.build(a, 1, 1, n)127 128 for range m {129 Fscan(in, &op, &l, &r, &k)130 if op == "=" {131 t.update(1, l, r, k)132 } else {133 s := t.query(1, l, r)134 res := 0135 powL := 1136 for j := k; j >= 0; j-- {137 res += s[j] * C[k][j] % mod66 * powL138 powL = powL * -(l - 1) % mod66139 }140 Fprintln(out, (res%mod66+mod66)%mod66)141 }142 }143}144 145146