Use this to learn the idea, then write your own version.
1package main2 3import (4 . "fmt"5 "io"6 "math/bits"7)8 910type seg69 []struct{ l, r, mn, todo int }11 12func (t seg69) apply(o, f int) {13 t[o].mn += f14 t[o].todo += f15}16 17func (t seg69) spread(o int) {18 f := t[o].todo19 if f == 0 {20 return21 }22 t.apply(o<<1, f)23 t.apply(o<<1|1, f)24 t[o].todo = 025}26 27func (t seg69) build(o, l, r int) {28 t[o].l, t[o].r = l, r29 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 seg69) update(o, l, r, f int) {38 if l <= t[o].l && t[o].r <= r {39 t.apply(o, f)40 return41 }42 t.spread(o)43 m := (t[o].l + t[o].r) >> 144 if l <= m {45 t.update(o<<1, l, r, f)46 }47 if m < r {48 t.update(o<<1|1, l, r, f)49 }50 t[o].mn = min(t[o<<1].mn, t[o<<1|1].mn)51}52 53func (t seg69) query(o, l, r int) int {54 if l <= t[o].l && t[o].r <= r {55 return t[o].mn56 }57 t.spread(o)58 m := (t[o].l + t[o].r) >> 159 if r <= m {60 return t.query(o<<1, l, r)61 }62 if l > m {63 return t.query(o<<1|1, l, r)64 }65 return min(t.query(o<<1, l, r), t.query(o<<1|1, l, r))66}67 68func cf1969E(in io.Reader, out io.Writer) {69 var T, n, v int70 for Fscan(in, &T); T > 0; T-- {71 Fscan(in, &n)72 t := make(seg69, 2<<bits.Len(uint(n-1)))73 t.build(1, 1, n)74 pre := make([]int, n+1)75 pre2 := make([]int, n+1)76 77 ans, l := 0, 178 for i := 1; i <= n; i++ {79 Fscan(in, &v)80 if pre[v] > 0 {81 t.update(1, pre2[v]+1, pre[v], -1)82 }83 t.update(1, pre[v]+1, i, 1)84 pre2[v] = pre[v]85 pre[v] = i86 if t.query(1, l, i) == 0 {87 ans++88 l = i + 189 }90 }91 Fprintln(out, ans)92 }93}94 9596