```go
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
type P struct {
v, m int
}
type Q struct {
l, r, idx int
}
type Fenwick struct {
t []int
n int
}
func NewFenwick(nn int) *Fenwick {
return &Fenwick{make([]int, nn+2), nn}
}
func (f *Fenwick) Update(idx, val int) {
for idx <= f.n {
f.t[idx] += val
idx += idx & -idx
}
}
func (f *Fenwick) Prefix(upto int) int {
res := 0
for upto > 0 {
res += f.t[upto]
upto -= upto & -upto
}
return res
}
func (f *Fenwick) Sum(lo, hi int) int {
return f.Prefix(hi) - f.Prefix(lo-1)
}
var tree [][]int
func build(node, start, end int, a []int) {
if start == end {
tree[node] = []int{a[start]}
return
}
mid := (start + end) / 2
build(2*node, start, mid, a)
build(2*node+1, mid+1, end, a)
left := tree[2*node]
right := tree[2*node+1]
merged := make([]int, len(left)+len(right))
i, j, k := 0, 0, 0
for i < len(left) && j < len(right) {
if left[i] <= right[j] {
merged[k] = left[i]
i++
} else {
merged[k] = right[j]
j++
}
k++
}
copy(merged[k:], left[i:])
k += len(left) - i
copy(merged[k:], right[j:])
tree[node] = merged
}
func query(node, start, end, ql, qr int, lists *[]*[]int) {
if ql > end || qr < start {
return
}
if ql <= start && end <= qr {
*lists = append(*lists, &tree[node])
return
}
mid := (start + end) / 2
query(2*node, start, mid, ql, qr, lists)
query(2*node+1, mid+1, end, ql, qr, lists)
}
func main() {
in := bufio.NewReader(os.Stdin)
var n, q int
fmt.Fscan(in, &n, &q)
a := make([]int, n+2)
for i := 1; i <= n; i++ {
fmt.Fscan(in, &a[i])
}
pos := make([][]int, n+2)
for i := 1; i <= n; i++ {
pos[a[i]] = append(pos[a[i]], i)
}
tree = make([][]int, 4*(n+2))
build(1, 1, n, a)
var points []P
for v := 1; v <= n; v++ {
pv := pos[v]
if len(pv) < 2 {
continue
}
for ii := 0; ii < len(pv)-1; ii++ {
le := pv[ii]
ri := pv[ii+1]
maxl := -1
if le+1 <= ri-1 {
var collected []*[]int
query(1, 1, n, le+1, ri-1, &collected)
for _, pp := range collected {
list := *pp
idx := sort.SearchInts(list, v)
if idx > 0 {
cand := list[idx-1]
if cand > maxl {
maxl = cand
}
}
}
}
points = append(points, P{v, maxl})
}
}
sort.Slice(points, func(i, j int) bool {
return points[i].m < points[j].m
})
var queries []Q
for qq := 0; qq < q; qq++ {
var ll, rr int
fmt.Fscan(in, &ll, &rr)
queries = append(queries, Q{ll, rr, qq})
}
sort.Slice(queries, func(i, j int) bool {
return queries[i].l < queries[j].l
})
prefix_count := make([]int, n+2)
for i := 1; i <= n; i++ {
prefix_count[i] = prefix_count[i-1] + len(pos[i])
}
ans := make([]int, q)
ft := NewFenwick(n)
curr := 0
for qq := 0; qq < q; qq++ {
ql := queries[qq].l
qr := queries[qq].r
qidx := queries[qq].idx
lim := ql - 1
for curr < len(points) && points[curr].m <= lim {
ft.Update(points[curr].v, 1)
curr++
}
ss := ft.Sum(ql, qr)
kk := prefix_count[qr] - prefix_count[ql-1]
ans[qidx] = kk - ss
}
out := bufio.NewWriter(os.Stdout)
for i := 0; i < q; i++ {
fmt.Fprintln(out, ans[i])
}
out.Flush()
}
```