Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910var swap01 []int11 12type seg01 []int13 14func (t seg01) maintain(o int) {15 t[o] = t[o<<1] + t[o<<1|1]16}17 18func (t seg01) build(a []int, o, l, r int) {19 if l == r {20 t[o] = a[l-1]21 return22 }23 m := (l + r) >> 124 t.build(a, o<<1, l, m)25 t.build(a, o<<1|1, m+1, r)26 t.maintain(o)27}28 29func (t seg01) update(o, ol, or, d, i, val int) {30 if ol == or {31 t[o] = val32 return33 }34 m := (ol + or) >> 135 sw := swap01[d]36 if i <= m {37 t.update(o<<1^sw, ol, m, d-1, i, val)38 } else {39 t.update(o<<1^1^sw, m+1, or, d-1, i, val)40 }41 t.maintain(o)42}43 44func (t seg01) query(o, ol, or, d, l, r int) int {45 if l <= ol && or <= r {46 return t[o]47 }48 m := (ol + or) >> 149 sw := swap01[d]50 if r <= m {51 return t.query(o<<1^sw, ol, m, d-1, l, r)52 }53 if m < l {54 return t.query(o<<1^1^sw, m+1, or, d-1, l, r)55 }56 return t.query(o<<1^sw, ol, m, d-1, l, r) + t.query(o<<1^1^sw, m+1, or, d-1, l, r)57}58 59func cf1401F(_r io.Reader, _w io.Writer) {60 in := bufio.NewReader(_r)61 out := bufio.NewWriter(_w)62 defer out.Flush()63 64 var w, q, op, l, r int65 Fscan(in, &w, &q)66 swap01 = make([]int, w+1)67 n := 1 << w68 a := make([]int, n)69 for i := range a {70 Fscan(in, &a[i])71 }72 t := make(seg01, n*2)73 t.build(a, 1, 1, n)74 for ; q > 0; q-- {75 Fscan(in, &op, &l)76 if op == 1 {77 Fscan(in, &r)78 t.update(1, 1, n, w, l, r)79 } else if op == 2 {80 81 for i := 0; i <= l; i++ {82 swap01[i] ^= 183 }84 } else if op == 3 {85 swap01[l+1] ^= 186 } else {87 Fscan(in, &r)88 Fprintln(out, t.query(1, 1, n, w, l, r))89 }90 }91}92 9394