← Home
package main

import (
	"bufio"
	"container/heap"
	"io"
	"os"
	"strconv"
)

type BIT struct {
	t []int
}

func NewBIT(n int) *BIT {
	return &BIT{t: make([]int, n+2)}
}

func (b *BIT) Add(i, delta int) {
	for i < len(b.t) {
		b.t[i] += delta
		i += i & -i
	}
}

func (b *BIT) Sum(i int) int {
	s := 0
	for i > 0 {
		s += b.t[i]
		i -= i & -i
	}
	return s
}

type Item struct {
	next int
	id   int
}

type MaxHeap []Item

func (h MaxHeap) Len() int { return len(h) }

func (h MaxHeap) Less(i, j int) bool {
	if h[i].next == h[j].next {
		return h[i].id > h[j].id
	}
	return h[i].next > h[j].next
}

func (h MaxHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }

func (h *MaxHeap) Push(x interface{}) {
	*h = append(*h, x.(Item))
}

func (h *MaxHeap) Pop() interface{} {
	old := *h
	n := len(old)
	x := old[n-1]
	*h = old[:n-1]
	return x
}

func readInts() []int {
	data, _ := io.ReadAll(os.Stdin)
	vals := make([]int, 0, len(data)/2)
	num := 0
	sign := 1
	inNum := false
	for _, c := range data {
		if c == '-' {
			sign = -1
		} else if c >= '0' && c <= '9' {
			num = num*10 + int(c-'0')
			inNum = true
		} else if inNum {
			vals = append(vals, sign*num)
			num = 0
			sign = 1
			inNum = false
		}
	}
	if inNum {
		vals = append(vals, sign*num)
	}
	return vals
}

func solveMoveToFront(n, q int, seq []int) []int {
	bit := NewBIT(n + q + 2)
	pos := make([]int, n+1)
	for i := 1; i <= n; i++ {
		p := q + i
		pos[i] = p
		bit.Add(p, 1)
	}
	top := q
	ans := make([]int, q)
	for i, x := range seq {
		p := pos[x]
		ans[i] = bit.Sum(p - 1)
		bit.Add(p, -1)
		bit.Add(top, 1)
		pos[x] = top
		top--
	}
	return ans
}

func solveCache(capacity, q int, seq []int) int {
	inf := q + 1
	nextPos := make([]int, q)
	last := make(map[int]int, q*2)
	for i := q - 1; i >= 0; i-- {
		x := seq[i]
		if p, ok := last[x]; ok {
			nextPos[i] = p
		} else {
			nextPos[i] = inf
		}
		last[x] = i
	}

	cur := make(map[int]int, capacity*2)
	h := &MaxHeap{}
	heap.Init(h)
	misses := 0

	for i, x := range seq {
		nxt := nextPos[i]
		if _, ok := cur[x]; ok {
			cur[x] = nxt
			heap.Push(h, Item{next: nxt, id: x})
			continue
		}

		misses++
		if len(cur) == capacity {
			for h.Len() > 0 {
				it := heap.Pop(h).(Item)
				if v, ok := cur[it.id]; ok && v == it.next {
					delete(cur, it.id)
					break
				}
			}
		}
		cur[x] = nxt
		heap.Push(h, Item{next: nxt, id: x})
	}

	return misses
}

func main() {
	vals := readInts()
	if len(vals) < 3 {
		return
	}

	a, b := vals[0], vals[1]
	rest := vals[2:]

	n, q := a, b
	if len(rest) == a && len(rest) != b {
		n, q = b, a
	}
	if q > len(rest) {
		q = len(rest)
	}
	seq := rest[:q]

	moveToFront := true
	for _, x := range seq {
		if x < 1 || x > n {
			moveToFront = false
			break
		}
	}

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer w.Flush()

	if moveToFront {
		ans := solveMoveToFront(n, q, seq)
		out := make([]byte, 0, q*8)
		for i, v := range ans {
			if i > 0 {
				out = append(out, ' ')
			}
			out = strconv.AppendInt(out, int64(v), 10)
		}
		out = append(out, '\n')
		w.Write(out)
	} else {
		ans := solveCache(n, q, seq)
		out := strconv.AppendInt(nil, int64(ans), 10)
		out = append(out, '\n')
		w.Write(out)
	}
}