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 seg40 []struct {12 l, r int13 cnt [26]int14 todo byte15}16 17const todoInit40 byte = 2618 19func (seg40) mergeInfo(a, b [26]int) [26]int {20 for i := range a {21 a[i] += b[i]22 }23 return a24}25 26func (t seg40) do(O int, v byte) {27 o := &t[O]28 o.cnt = [26]int{}29 o.cnt[v] = o.r - o.l + 130 o.todo = v31}32 33func (t seg40) spread(o int) {34 if v := t[o].todo; v != todoInit40 {35 t.do(o<<1, v)36 t.do(o<<1|1, v)37 t[o].todo = todoInit4038 }39}40 41func (t seg40) build(a []byte, o, l, r int) {42 t[o].l, t[o].r = l, r43 t[o].todo = todoInit4044 if l == r {45 t[o].cnt[a[l-1]-'a'] = 146 return47 }48 m := (l + r) >> 149 t.build(a, o<<1, l, m)50 t.build(a, o<<1|1, m+1, r)51 t.maintain(o)52}53 54func (t seg40) maintain(o int) {55 t[o].cnt = t.mergeInfo(t[o<<1].cnt, t[o<<1|1].cnt)56}57 58func (t seg40) update(o, l, r int, v byte) {59 if l <= t[o].l && t[o].r <= r {60 t.do(o, v)61 return62 }63 t.spread(o)64 m := (t[o].l + t[o].r) >> 165 if l <= m {66 t.update(o<<1, l, r, v)67 }68 if m < r {69 t.update(o<<1|1, l, r, v)70 }71 t.maintain(o)72}73 74func (t seg40) query(o, l, r int) [26]int {75 if l <= t[o].l && t[o].r <= r {76 return t[o].cnt77 }78 t.spread(o)79 m := (t[o].l + t[o].r) >> 180 if r <= m {81 return t.query(o<<1, l, r)82 }83 if l > m {84 return t.query(o<<1|1, l, r)85 }86 return t.mergeInfo(t.query(o<<1, l, r), t.query(o<<1|1, l, r))87}88 89func (t seg40) spreadAll(o int, s []byte) {90 if t[o].l == t[o].r {91 for i, c := range t[o].cnt {92 if c > 0 {93 s[t[o].l-1] = 'a' + byte(i)94 break95 }96 }97 return98 }99 t.spread(o)100 t.spreadAll(o<<1, s)101 t.spreadAll(o<<1|1, s)102}103 104func cf240F(_r io.Reader, out io.Writer) {105 in := bufio.NewReader(_r)106 var n, m, l, r int107 var s []byte108 Fscan(in, &n, &m, &s)109 t := make(seg40, 2<<bits.Len(uint(n-1)))110 t.build(s, 1, 1, n)111 for ; m > 0; m-- {112 Fscan(in, &l, &r)113 cnt := t.query(1, l, r)114 odd := 0115 for _, c := range cnt {116 odd += c % 2117 }118 if odd > 1 {119 continue120 }121 for i, c := range cnt {122 if c == 0 {123 continue124 }125 h := c / 2126 if h > 0 {127 t.update(1, l, l+h-1, byte(i))128 t.update(1, r-h+1, r, byte(i))129 l += h130 r -= h131 }132 if c%2 > 0 {133 m := (l + r) / 2134 t.update(1, m, m, byte(i))135 }136 }137 }138 t.spreadAll(1, s)139 Fprintf(out, "%s", s)140}141 142143