package main
import (
"io"
"os"
"strconv"
)
func nextInt(data []byte, idx *int) int {
n := len(data)
for *idx < n {
c := data[*idx]
if c >= '0' && c <= '9' {
break
}
*idx = *idx + 1
}
val := 0
for *idx < n {
c := data[*idx]
if c < '0' || c > '9' {
break
}
val = val*10 + int(c-'0')
*idx = *idx + 1
}
return val
}
func lowerBound(arr []int, x int) int {
l, r := 0, len(arr)
for l < r {
m := int(uint(l+r) >> 1)
if arr[m] < x {
l = m + 1
} else {
r = m
}
}
return l
}
func merge(a, b []int) []int {
if len(a) == 0 {
return b
}
if len(b) == 0 {
return a
}
c := make([]int, len(a)+len(b))
i, j, k := 0, 0, 0
for i < len(a) && j < len(b) {
if a[i] <= b[j] {
c[k] = a[i]
i++
} else {
c[k] = b[j]
j++
}
k++
}
for i < len(a) {
c[k] = a[i]
i++
k++
}
for j < len(b) {
c[k] = b[j]
j++
k++
}
return c
}
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
n := nextInt(data, &idx)
k := nextInt(data, &idx)
occ := make([][]int, 100001)
prevK := make([]int, n+1)
for i := 1; i <= n; i++ {
v := nextInt(data, &idx)
lst := occ[v]
if len(lst) >= k {
prevK[i] = lst[len(lst)-k]
}
occ[v] = append(lst, i)
}
size := 1
for size < n {
size <<= 1
}
tree := make([][]int, size<<1)
for i := 0; i < n; i++ {
tree[size+i] = []int{prevK[i+1]}
}
for i := size - 1; i >= 1; i-- {
tree[i] = merge(tree[i<<1], tree[i<<1|1])
}
q := nextInt(data, &idx)
out := make([]byte, 0, q*8)
last := 0
for i := 0; i < q; i++ {
x := nextInt(data, &idx)
y := nextInt(data, &idx)
l := (x + last) % n
r := (y + last) % n
l++
r++
if l > r {
l, r = r, l
}
cnt := 0
L := l + size - 1
R := r + size - 1
for L <= R {
if (L & 1) == 1 {
arr := tree[L]
cnt += len(arr) - lowerBound(arr, l)
L++
}
if (R & 1) == 0 {
arr := tree[R]
cnt += len(arr) - lowerBound(arr, l)
R--
}
L >>= 1
R >>= 1
}
ans := (r - l + 1) - cnt
out = strconv.AppendInt(out, int64(ans), 10)
out = append(out, '\n')
last = ans
}
os.Stdout.Write(out)
}