Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910type seg05 []struct {11 l, r int12 state int813 flip bool14}15 16func (t seg05) maintain(o int) {17 x, y := t[o<<1].state, t[o<<1|1].state18 if x < 0 && y < 0 {19 t[o].state = -120 } else if x > 0 && y > 0 {21 t[o].state = 122 } else {23 t[o].state = 024 }25}26 27func (t seg05) build(o, l, r int) {28 t[o].l, t[o].r, t[o].state = l, r, -129 if l == r {30 return31 }32 m := (l + r) >> 133 t.build(o<<1, l, m)34 t.build(o<<1|1, m+1, r)35}36 37func (t seg05) do(o int) {38 t[o].state = -t[o].state39 t[o].flip = !t[o].flip40}41 42func (t seg05) spread(o int) {43 if t[o].flip {44 t.do(o << 1)45 t.do(o<<1 | 1)46 t[o].flip = false47 }48}49 50func (t seg05) flip(o, l, r int) {51 if l <= t[o].l && t[o].r <= r {52 t.do(o)53 return54 }55 t.spread(o)56 m := (t[o].l + t[o].r) >> 157 if l <= m {58 t.flip(o<<1, l, r)59 }60 if m < r {61 t.flip(o<<1|1, l, r)62 }63 t.maintain(o)64}65 66func (t seg05) next0(o, l int) int {67 if t[o].l == t[o].r {68 if t[o].state < 0 {69 return t[o].l70 }71 return 072 }73 t.spread(o)74 m := (t[o].l + t[o].r) >> 175 if l <= m && t[o<<1].state <= 0 {76 if p := t.next0(o<<1, l); p > 0 {77 return p78 }79 }80 return t.next0(o<<1|1, l)81}82 83func (t seg05) next1(o, l int) int {84 if t[o].l == t[o].r {85 if t[o].state > 0 {86 return t[o].l87 }88 return 089 }90 t.spread(o)91 m := (t[o].l + t[o].r) >> 192 if l <= m && t[o<<1].state >= 0 {93 if p := t.next1(o<<1, l); p > 0 {94 return p95 }96 }97 return t.next1(o<<1|1, l)98}99 100func (t seg05) last1(o int) int {101 if t[o].l == t[o].r {102 return t[o].l103 }104 t.spread(o)105 if t[o<<1|1].state >= 0 {106 return t.last1(o<<1 | 1)107 }108 return t.last1(o << 1)109}110 111func CF1705E(_r io.Reader, _w io.Writer) {112 in := bufio.NewReader(_r)113 out := bufio.NewWriter(_w)114 defer out.Flush()115 const mx int = 2e5 + 20116 117 var n, q, i, v int118 Fscan(in, &n, &q)119 a := make([]int, n+1)120 t := make(seg05, mx*4)121 t.build(1, 1, mx)122 for i := 1; i <= n; i++ {123 Fscan(in, &a[i])124 t.flip(1, a[i], t.next0(1, a[i]))125 }126 for ; q > 0; q-- {127 Fscan(in, &i, &v)128 t.flip(1, a[i], t.next1(1, a[i]))129 a[i] = v130 t.flip(1, v, t.next0(1, v))131 Fprintln(out, t.last1(1))132 }133}134 135136