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 10type pstNode813E struct {11 l, r int12 lo, ro *pstNode813E13 sum int14}15type pst813E struct {16 nodes []pstNode813E17 versionRoots []*pstNode813E18}19 20func (t *pst813E) _build(l, r int) *pstNode813E {21 t.nodes = append(t.nodes, pstNode813E{l: l, r: r})22 o := &t.nodes[len(t.nodes)-1]23 if l == r {24 return o25 }26 mid := (l + r) >> 127 o.lo = t._build(l, mid)28 o.ro = t._build(mid+1, r)29 return o30}31 32func (t *pst813E) _update(o *pstNode813E, idx int, val int) *pstNode813E {33 t.nodes = append(t.nodes, *o)34 o = &t.nodes[len(t.nodes)-1]35 if o.l == o.r {36 o.sum += val37 return o38 }39 if mid := o.lo.r; idx <= mid {40 o.lo = t._update(o.lo, idx, val)41 } else {42 o.ro = t._update(o.ro, idx, val)43 }44 o.sum = o.lo.sum + o.ro.sum45 return o46}47 48func (t *pst813E) _query(o *pstNode813E, l, r int) (res int) {49 if l <= o.l && o.r <= r {50 return o.sum51 }52 mid := o.lo.r53 if l <= mid {54 res += t._query(o.lo, l, r)55 }56 if mid < r {57 res += t._query(o.ro, l, r)58 }59 return60}61 62func (t *pst813E) init(n int) {63 t.versionRoots[0] = t._build(1, n)64}65 66func (t *pst813E) update(dstVersion, srcVersion int, idx int, val int) {67 t.versionRoots[dstVersion] = t._update(t.versionRoots[srcVersion], idx, val)68}69 70func (t *pst813E) query(version int, l, r int) (sum int) {71 return t._query(t.versionRoots[version], l, r)72}73 7475func Sol813E(reader io.Reader, writer io.Writer) {76 in := bufio.NewReader(reader)77 out := bufio.NewWriter(writer)78 defer out.Flush()79 80 var n, k, v, q, l, r int81 Fscan(in, &n, &k)82 t := &pst813E{83 make([]pstNode813E, 0, (bits.Len(uint(n))+2)*2*n),84 make([]*pstNode813E, n+1),85 }86 t.init(n)87 idx := [100001][]int{}88 for i := 1; i <= n; i++ {89 Fscan(in, &v)90 t.update(i, i-1, i, 1) 91 idx[v] = append(idx[v], i)92 if sz := len(idx[v]); sz > k {93 t.update(i, i, idx[v][sz-k-1], -1) 94 }95 }96 97 last := 098 for Fscan(in, &q); q > 0; q-- {99 Fscan(in, &l, &r)100 l = (l+last)%n + 1101 r = (r+last)%n + 1102 if l > r {103 l, r = r, l104 }105 last = t.query(r, l, r)106 Fprintln(out, last)107 }108}109 110111112113