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 1011type data45 struct{ c0, c1, c01, c10 int }12 13type seg45 []struct {14 l, r int15 d data4516 flip bool17}18 19func (t seg45) mergeInfo(a, b data45) (c data45) {20 c.c0 = a.c0 + b.c021 c.c1 = a.c1 + b.c122 c.c01 = max(a.c01+b.c1, a.c0+b.c01)23 c.c10 = max(a.c10+b.c0, a.c1+b.c10)24 return25}26 27func (t seg45) do(O int) {28 o := &t[O]29 d := o.d30 o.d = data45{d.c1, d.c0, d.c10, d.c01}31 o.flip = !o.flip32}33 34func (t seg45) build(s string, o, l, r int) {35 t[o].l, t[o].r = l, r36 if l == r {37 c1 := int(s[l-1] & 1)38 t[o].d = data45{c1 ^ 1, c1, 1, 1}39 return40 }41 m := (l + r) >> 142 t.build(s, o<<1, l, m)43 t.build(s, o<<1|1, m+1, r)44 t[o].d = t.mergeInfo(t[o<<1].d, t[o<<1|1].d)45}46 47func (t seg45) update(o, l, r int) {48 if l <= t[o].l && t[o].r <= r {49 t.do(o)50 return51 }52 if t[o].flip {53 t.do(o << 1)54 t.do(o<<1 | 1)55 t[o].flip = false56 }57 m := (t[o].l + t[o].r) >> 158 if l <= m {59 t.update(o<<1, l, r)60 }61 if m < r {62 t.update(o<<1|1, l, r)63 }64 t[o].d = t.mergeInfo(t[o<<1].d, t[o<<1|1].d)65}66 67func cf145E(_r io.Reader, _w io.Writer) {68 in := bufio.NewReader(_r)69 out := bufio.NewWriter(_w)70 defer out.Flush()71 72 var n, m, l, r int73 var s string74 Fscan(in, &n, &m, &s)75 t := make(seg45, 2<<bits.Len(uint(n-1)))76 t.build(s, 1, 1, n)77 for ; m > 0; m-- {78 Fscan(in, &s)79 if s[0] == 's' {80 Fscan(in, &l, &r)81 t.update(1, l, r)82 } else {83 Fprintln(out, t[1].d.c01)84 }85 }86}87 8889