Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 9type node42 struct {10 l, r int3211 sum int3212 revChildren bool13}14type seg42 []node4215 16func (t seg42) _pushUp(o int) {17 lo, ro := t[o<<1], t[o<<1|1]18 t[o].sum = lo.sum + ro.sum19}20 21func (t seg42) _build(arr []int32, pos uint8, o int, l, r int32) {22 t[o].l, t[o].r = l, r23 if l == r {24 t[o].sum = arr[l-1] >> pos & 125 return26 }27 mid := (l + r) >> 128 t._build(arr, pos, o<<1, l, mid)29 t._build(arr, pos, o<<1|1, mid+1, r)30 t._pushUp(o)31}32 33func (t seg42) _spread(o int) {34 if t[o].revChildren {35 lo, ro := &t[o<<1], &t[o<<1|1]36 lo.sum = lo.r - lo.l + 1 - lo.sum37 ro.sum = ro.r - ro.l + 1 - ro.sum38 lo.revChildren = !lo.revChildren39 ro.revChildren = !ro.revChildren40 t[o].revChildren = false41 }42}43 44func (t seg42) _rev(o int, l, r int32) {45 ol, or := t[o].l, t[o].r46 if l <= ol && or <= r {47 t[o].sum = or - ol + 1 - t[o].sum48 t[o].revChildren = !t[o].revChildren49 return50 }51 t._spread(o)52 mid := (ol + or) >> 153 if l <= mid {54 t._rev(o<<1, l, r)55 }56 if mid < r {57 t._rev(o<<1|1, l, r)58 }59 t._pushUp(o)60}61 62func (t seg42) _query(o int, l, r int32) (res int32) {63 if l <= t[o].l && t[o].r <= r {64 return t[o].sum65 }66 t._spread(o)67 mid := (t[o].l + t[o].r) >> 168 if l <= mid {69 res += t._query(o<<1, l, r)70 }71 if mid < r {72 res += t._query(o<<1|1, l, r)73 }74 return75}76 77func (t seg42) init(arr []int32, pos uint8) { t._build(arr, pos, 1, 1, int32(len(arr))) }78func (t seg42) rev(l, r int32) { t._rev(1, l, r) }79func (t seg42) query(l, r int32) int32 { return t._query(1, l, r) }80 8182func Sol242E(reader io.Reader, writer io.Writer) {83 in := bufio.NewReader(reader)84 out := bufio.NewWriter(writer)85 defer out.Flush()86 87 var n, q int88 Fscan(in, &n)89 arr := make([]int32, n)90 for i := range arr {91 Fscan(in, &arr[i])92 }93 trees := make([]seg42, 20)94 for i := range trees {95 trees[i] = make(seg42, 4*n)96 trees[i].init(arr, uint8(i))97 }98 99 for Fscan(in, &q); q > 0; q-- {100 var op, l, r, x int32101 Fscan(in, &op, &l, &r)102 if op == 1 {103 sum := 0104 for i, t := range trees {105 sum += 1 << uint(i) * int(t.query(l, r))106 }107 Fprintln(out, sum)108 } else {109 Fscan(in, &x)110 for i, t := range trees {111 if x>>uint(i)&1 == 1 {112 t.rev(l, r)113 }114 }115 }116 }117}118 119120121122