Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910type seg33 []struct {11 l, r int12 max, todo int13}14 15func (t seg33) maintain(o int) {16 t[o].max = max(t[o<<1].max, t[o<<1|1].max)17}18 19func (t seg33) do(o, v int) {20 t[o].max += v21 t[o].todo += v22}23 24func (t seg33) build(f []int, o, l, r int) {25 t[o].l, t[o].r = l, r26 t[o].todo = 027 if l == r {28 t[o].max = f[l-1] 29 return30 }31 m := (l + r) >> 132 t.build(f, o<<1, l, m)33 t.build(f, o<<1|1, m+1, r)34 t.maintain(o)35}36 37func (t seg33) spread(o int) {38 if v := t[o].todo; v != 0 {39 t.do(o<<1, v)40 t.do(o<<1|1, v)41 t[o].todo = 042 }43}44 45func (t seg33) inc(o, l, r int) {46 if l <= t[o].l && t[o].r <= r {47 t.do(o, 1)48 return49 }50 t.spread(o)51 m := (t[o].l + t[o].r) >> 152 if l <= m {53 t.inc(o<<1, l, r)54 }55 if m < r {56 t.inc(o<<1|1, l, r)57 }58 t.maintain(o)59}60 61func (t seg33) query(o, l, r int) int {62 if l <= t[o].l && t[o].r <= r {63 return t[o].max64 }65 t.spread(o)66 m := (t[o].l + t[o].r) >> 167 if r <= m {68 return t.query(o<<1, l, r)69 }70 if l > m {71 return t.query(o<<1|1, l, r)72 }73 return max(t.query(o<<1, l, r), t.query(o<<1|1, l, r))74}75 76func CF833B(_r io.Reader, out io.Writer) {77 in := bufio.NewReader(_r)78 var n, k, v int79 Fscan(in, &n, &k)80 pre := make([]int, n+1)81 p := make([]int, n+1)82 for i := 1; i <= n; i++ {83 Fscan(in, &v)84 pre[i] = p[v]85 p[v] = i86 }87 88 f := make([]int, n+1)89 t := make(seg33, n*4)90 for ; k > 0; k-- {91 t.build(f, 1, 1, n)92 for i := 1; i <= n; i++ {93 t.inc(1, pre[i]+1, i)94 f[i] = t.query(1, 1, i)95 }96 }97 Fprint(out, f[n])98}99 100101