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 1011var x04 int12type pair04 struct{ v, cnt int }13type data04 struct {14 pre, suf []pair0415 cnt int16}17type seg04 []struct {18 l, r int19 val data0420}21 22func (seg04) merge(a, b []pair04) []pair04 {23 c := append(make([]pair04, 0, len(a)+len(b)), a...)24 for j := range c {25 c[j].v |= b[0].v26 }27 c = append(c, b...)28 j := 029 for _, t := range c[1:] {30 if c[j].v != t.v {31 j++32 c[j] = t33 } else {34 c[j].cnt += t.cnt35 }36 }37 return c[:j+1]38}39 40func (t seg04) mergeInfo(ld, rd data04) data04 {41 cnt := ld.cnt + rd.cnt42 a, b := ld.suf, rd.pre 43 s, i := 0, 044 for j := len(b) - 1; j >= 0; j-- {45 t := b[j]46 for ; i < len(a) && a[i].v|t.v >= x04; i++ {47 s += a[i].cnt48 }49 cnt += s * t.cnt50 }51 return data04{t.merge(rd.pre, ld.pre), t.merge(ld.suf, rd.suf), cnt}52}53 54func (t seg04) build(a []int, o, l, r int) {55 t[o].l, t[o].r = l, r56 if l == r {57 p := pair04{a[l-1], 1}58 t[o].val.pre = []pair04{p}59 t[o].val.suf = []pair04{p}60 if a[l-1] >= x04 {61 t[o].val.cnt = 162 }63 return64 }65 m := (l + r) >> 166 t.build(a, o<<1, l, m)67 t.build(a, o<<1|1, m+1, r)68 t.maintain(o)69}70 71func (t seg04) update(o, i, val int) {72 if t[o].l == t[o].r {73 t[o].val.pre[0].v = val74 t[o].val.suf[0].v = val75 if val >= x04 {76 t[o].val.cnt = 177 } else {78 t[o].val.cnt = 079 }80 return81 }82 m := (t[o].l + t[o].r) >> 183 if i <= m {84 t.update(o<<1, i, val)85 } else {86 t.update(o<<1|1, i, val)87 }88 t.maintain(o)89}90 91func (t seg04) maintain(o int) {92 t[o].val = t.mergeInfo(t[o<<1].val, t[o<<1|1].val)93}94 95func (t seg04) query(o, l, r int) (res data04) {96 if l <= t[o].l && t[o].r <= r {97 return t[o].val98 }99 m := (t[o].l + t[o].r) >> 1100 if r <= m {101 return t.query(o<<1, l, r)102 }103 if m < l {104 return t.query(o<<1|1, l, r)105 }106 return t.mergeInfo(t.query(o<<1, l, r), t.query(o<<1|1, l, r))107}108 109func cf1004F(_r io.Reader, _w io.Writer) {110 in := bufio.NewReader(_r)111 out := bufio.NewWriter(_w)112 defer out.Flush()113 114 var n, m, op, l, r int115 Fscan(in, &n, &m, &x04)116 a := make([]int, n)117 for i := range a {118 Fscan(in, &a[i])119 }120 t := make(seg04, 2<<bits.Len(uint(n-1)))121 t.build(a, 1, 1, n)122 for ; m > 0; m-- {123 Fscan(in, &op, &l, &r)124 if op == 1 {125 t.update(1, l, r)126 } else {127 Fprintln(out, t.query(1, l, r).cnt)128 }129 }130}131 132133