package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func configure(scanner *bufio.Scanner) {
	scanner.Split(bufio.ScanWords)
	scanner.Buffer(make([]byte, 1000005), 1000005)
}
func getNextString(scanner *bufio.Scanner) string {
	scanned := scanner.Scan()
	if !scanned {
		panic("scan failed")
	}
	return scanner.Text()
}
func getNextInt(scanner *bufio.Scanner) int {
	i, _ := strconv.Atoi(getNextString(scanner))
	return i
}
func getNextInt64(scanner *bufio.Scanner) int64 {
	i, _ := strconv.ParseInt(getNextString(scanner), 10, 64)
	return i
}
func getNextFloat64(scanner *bufio.Scanner) float64 {
	i, _ := strconv.ParseFloat(getNextString(scanner), 64)
	return i
}
func main() {
	fp := os.Stdin
	wfp := os.Stdout
	extra := 0
	if os.Getenv("I") == "IronMan" {
		fp, _ = os.Open(os.Getenv("END_GAME"))
		extra = 100
	}
	scanner := bufio.NewScanner(fp)
	configure(scanner)
	writer := bufio.NewWriter(wfp)
	defer func() {
		r := recover()
		if r != nil {
			fmt.Fprintln(writer, r)
		}
		writer.Flush()
	}()
	solve(scanner, writer)
	for i := 0; i < extra; i++ {
		fmt.Fprintln(writer, "-----------------------------------")
		solve(scanner, writer)
	}
}
func solve(scanner *bufio.Scanner, writer *bufio.Writer) {
	n := getNextInt(scanner)
	q := getNextInt(scanner)
	cc := make([]int, n)
	wl := WaveletKeanuReeves{}
	ii := make([][]int, n)
	for i := 0; i < n; i++ {
		cc[i] = getNextInt(scanner) - 1
		ii[cc[i]] = append(ii[cc[i]], i)
	}
	nn := make([]int, n)
	for i := 0; i < n; i++ {
		nn[i] = n
	}
	for i := 0; i < n; i++ {
		for j := 0; j < len(ii[i])-1; j++ {
			nn[ii[i][j]] = ii[i][j+1]
		}
	}
	wl.init(nn)

	for i := 0; i < q; i++ {
		l := getNextInt(scanner) - 1
		r := getNextInt(scanner)
		fmt.Fprintln(writer, r-l-wl.rangerankless(l, r, r))
	}
}

// WaveletKeanuReeves ...
type WaveletKeanuReeves struct {
	bits, n        int
	tree           [][]int
	data, topIndex []int
}

func (wl *WaveletKeanuReeves) init(raw []int) {
	n := len(raw)
	wl.bits = 20
	wl.tree = make([][]int, wl.bits, wl.bits)
	wl.data = make([]int, wl.bits*(n+1), wl.bits*(n+1))

	buf := make([]int, n, n)
	sorted := make([]int, n, n)
	wl.topIndex = make([]int, n, n)
	for i := 0; i < n; i++ {
		sorted[i] = i
		wl.topIndex[i] = -1
	}

	for i := wl.bits - 1; i >= 0; i-- {
		wl.tree[i] = wl.data[i*(n+1) : (i+1)*(n+1)]
		bi := 0
		si := 0
		for ii := 0; ii < n; ii++ {
			wl.tree[i][ii+1] = (raw[sorted[ii]] >> uint(i)) & 1
			if wl.tree[i][ii+1] == 0 {
				sorted[si] = sorted[ii]
				si++
			} else {
				buf[bi] = sorted[ii]
				bi++
			}
			wl.tree[i][ii+1] += wl.tree[i][ii]
		}
		for ii := 0; ii < bi; ii++ {
			sorted[si+ii] = buf[ii]
		}
	}

	wl.n = n
}

func (wl *WaveletKeanuReeves) count0(h, i int) int {
	return i - wl.tree[h][i]
}

func (wl *WaveletKeanuReeves) count1(h, i int) int {
	return wl.tree[h][i]
}

func (wl *WaveletKeanuReeves) next(h, i int) int {
	bit := wl.tree[h][i+1] - wl.tree[h][i]
	if bit == 0 {
		return wl.count0(h, i)
	}
	index := wl.count0(h, wl.n) + wl.tree[h][i]
	return index
}

func (wl *WaveletKeanuReeves) nextrange0(h, l, r int) (int, int) {
	return wl.count0(h, l), wl.count0(h, r)
}

func (wl *WaveletKeanuReeves) nextrange1(h, l, r int) (int, int) {
	start1 := wl.count0(h, wl.n)
	return start1 + wl.count1(h, l), start1 + wl.count1(h, r)
}

func (wl *WaveletKeanuReeves) access(at int) int {
	var ans int

	for i := wl.bits - 1; i >= 0; i-- {
		bit := wl.tree[i][at+1] - wl.tree[i][at]
		ans |= bit << uint(i)
		at = wl.next(i, at)
	}

	return ans
}

func (wl *WaveletKeanuReeves) rank(at, c int) int {
	l := 0
	r := at
	for i := wl.bits - 1; i >= 0 && l < r; i-- {
		bit := (c >> uint(i)) & 1
		if bit == 0 {
			l, r = wl.nextrange0(i, l, r)
			continue
		}
		l, r = wl.nextrange1(i, l, r)
	}

	return r - l
}

func (wl *WaveletKeanuReeves) rank0(h, at int) int {
	l := 0
	r := wl.n
	for l < r {
		m := (l + r) >> 1
		if wl.count0(h, m) < at+1 {
			l = m + 1
			continue
		}
		r = m
	}
	return l - 1
}

func (wl *WaveletKeanuReeves) rank1(h, at int) int {
	l := 0
	r := wl.n
	for l < r {
		m := (l + r) >> 1
		if wl.count1(h, m) < at+1 {
			l = m + 1
			continue
		}
		r = m
	}
	return l - 1
}

func (wl *WaveletKeanuReeves) gotop(h, index int) int {
	for i := h; i < wl.bits; i++ {
		index1 := wl.count0(i, wl.n)
		if index < index1 {
			index = wl.rank0(i, index)
			continue
		}
		index = wl.rank1(i, index-index1)
	}
	return index
}

func (wl *WaveletKeanuReeves) gettopindex(index int) int {
	if wl.topIndex[index] != -1 {
		return wl.topIndex[index]
	}
	wl.topIndex[index] = wl.gotop(0, index)
	return wl.topIndex[index]
}

func (wl *WaveletKeanuReeves) selects(at, c int) int {
	l := 0
	r := wl.n
	for i := wl.bits - 1; i >= 0 && l < r; i-- {
		bit := (c >> uint(i)) & 1
		if bit == 0 {
			l, r = wl.nextrange0(i, l, r)
			continue
		}
		l, r = wl.nextrange1(i, l, r)
	}
	return wl.gettopindex(l + at)
}

func (wl *WaveletKeanuReeves) getbottomrange(l, r, c int) (int, int) {
	for i := wl.bits - 1; i >= 0; i-- {
		bit := (c >> uint(i)) & 1
		if bit == 0 {
			l, r = wl.nextrange0(i, l, r)
			continue
		}
		l, r = wl.nextrange1(i, l, r)
	}
	return l, r
}

func (wl *WaveletKeanuReeves) quantile(l, r, rank int) int {
	if rank > r-l {
		return -1
	}
	var ans int
	for i := wl.bits - 1; i >= 0; i-- {
		c1 := wl.count1(i, r) - wl.count1(i, l)
		if c1 >= rank {
			ans |= 1 << uint(i)
			l, r = wl.nextrange1(i, l, r)
			continue
		}
		l, r = wl.nextrange0(i, l, r)
		rank -= c1
	}

	return ans
}

func (wl *WaveletKeanuReeves) rangerankless(l, r, c int) int {
	ans := 0
	for i := wl.bits - 1; i >= 0; i-- {
		bit := (c >> uint(i)) & 1
		if bit == 0 {
			l, r = wl.nextrange0(i, l, r)
			continue
		}
		ans += wl.count0(i, r) - wl.count0(i, l)
		l, r = wl.nextrange1(i, l, r)
	}

	return ans
}

func (wl *WaveletKeanuReeves) rangerankmore(l, r, c int) int {
	ans := 0
	for i := wl.bits - 1; i >= 0; i-- {
		bit := (c >> uint(i)) & 1
		if bit == 1 {
			l, r = wl.nextrange1(i, l, r)
			continue
		}
		ans += wl.count1(i, r) - wl.count1(i, l)
		l, r = wl.nextrange0(i, l, r)
	}

	return ans
}

func (wl *WaveletKeanuReeves) rangefreq(l, r, min, max int) int {
	return wl.rangerankless(l, r, max) - wl.rangerankless(l, r, min)
}

func (wl *WaveletKeanuReeves) prevless(at, c int) int {
	l := 0
	r := at
	for l < r {
		m := (l + r) >> 1
		if wl.rangerankless(m, at, c) == 0 {
			r = m
			continue
		}
		l = m + 1
	}

	return l - 1
}

func (wl *WaveletKeanuReeves) prevmore(at, c int) int {
	l := 0
	r := at
	for l < r {
		m := (l + r) >> 1
		if wl.rangerankmore(m, at, c) == 0 {
			r = m
			continue
		}
		l = m + 1
	}

	return l - 1
}

func (wl *WaveletKeanuReeves) nextless(at, c int) int {
	l := at + 1
	r := wl.n
	for l < r {
		m := (l + r) >> 1
		if wl.rangerankless(at+1, m+1, c) == 0 {
			l = m + 1
			continue
		}
		r = m
	}

	return r
}

func (wl *WaveletKeanuReeves) nextmore(at, c int) int {
	l := at + 1
	r := wl.n
	for l < r {
		m := (l + r) >> 1
		if wl.rangerankmore(at+1, m+1, c) == 0 {
			l = m + 1
			continue
		}
		r = m
	}

	return r
}


Measured memory_bytes: 118148