Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math"8 "sort"9)10 1112func CF940F(_r io.Reader, _w io.Writer) {13 in := bufio.NewReader(_r)14 out := bufio.NewWriter(_w)15 defer out.Flush()16 17 var n, q, op, pos, v int18 Fscan(in, &n, &q)19 rk := map[int]int{}20 a := make([]int, n+1)21 for i := 1; i <= n; i++ {22 Fscan(in, &v)23 if rk[v] == 0 {24 rk[v] = len(rk) + 125 }26 a[i] = rk[v]27 }28 B := int(math.Round(math.Pow(float64(n), 2.0/3)))29 type query struct{ lb, rb, l, r, t, qid int }30 type modify struct{ pos, val int }31 qs := []query{}32 ms := []modify{}33 for ; q > 0; q-- {34 if Fscan(in, &op); op == 1 {35 var l, r int36 Fscan(in, &l, &r)37 qs = append(qs, query{l / B, (r + 1) / B, l, r + 1, len(ms), len(qs)})38 } else {39 Fscan(in, &pos, &v)40 if rk[v] == 0 {41 rk[v] = len(rk) + 142 }43 ms = append(ms, modify{pos, rk[v]})44 }45 }46 sort.Slice(qs, func(i, j int) bool {47 a, b := qs[i], qs[j]48 if a.lb != b.lb {49 return a.lb < b.lb50 }51 if a.rb != b.rb {52 return a.rb < b.rb53 }54 if a.rb&1 == 0 {55 return a.t < b.t56 }57 return a.t > b.t58 })59 60 cnt := make([]int, len(rk)+1)61 cc := make([]int, n+2) 62 l, r, now := 1, 1, 063 add := func(val int) {64 cc[cnt[val]]--65 cnt[val]++66 cc[cnt[val]]++67 }68 del := func(val int) {69 cc[cnt[val]]--70 cnt[val]--71 cc[cnt[val]]++72 }73 ans := make([]int, len(qs))74 for _, q := range qs {75 for ; r < q.r; r++ {76 add(a[r])77 }78 for ; l < q.l; l++ {79 del(a[l])80 }81 for l > q.l {82 l--83 add(a[l])84 }85 for r > q.r {86 r--87 del(a[r])88 }89 for ; now < q.t; now++ {90 m := ms[now]91 p, v := m.pos, m.val92 if q.l <= p && p < q.r {93 del(a[p])94 add(v)95 }96 a[p], ms[now].val = v, a[p]97 }98 for now > q.t {99 now--100 m := ms[now]101 p, v := m.pos, m.val102 if q.l <= p && p < q.r {103 del(a[p])104 add(v)105 }106 a[p], ms[now].val = v, a[p]107 }108 for ans[q.qid] = 1; cc[ans[q.qid]] > 0; ans[q.qid]++ {109 }110 }111 for _, v := range ans {112 Fprintln(out, v)113 }114}115 116117