#include <iostream>
#include <vector>
#include <unordered_set>
#include <algorithm>
#include <limits>
using namespace std;
// Hàm tìm chỉ mục của lần sử dụng tiếp theo của một dụng cụ
// Bắt đầu tìm từ vị trí 'start_index'
// Trả về -1 nếu dụng cụ đó không được sử dụng lại nữa
int find_next_use(int tool_id, int start_index, const vector<int>& requests) {
for (int j = start_index; j < requests.size(); ++j) {
if (requests[j] == tool_id) {
return j;
}
}
return -1; // Không bao giờ được dùng lại
}
void solve() {
// N: Kích thước cache (theo đề bài: N <= 1000)
// k: Độ dài chuỗi yêu cầu (theo đề bài: k <= 20000)
int N, k;
if (!(cin >> N >> k)) return;
// requests: Chuỗi yêu cầu dụng cụ a1, a2, ..., ak
vector<int> requests(k);
for (int i = 0; i < k; ++i) {
cin >> requests[i];
}
// cache: Tập hợp các dụng cụ hiện có trong cache
unordered_set<int> cache;
int miss_count = 0;
// Duyệt qua chuỗi yêu cầu
for (int i = 0; i < k; ++i) {
int current_tool = requests[i];
// 1. Cache Hit (Dụng cụ có sẵn)
if (cache.count(current_tool)) {
continue;
}
// 2. Cache Miss (Dụng cụ chưa có)
miss_count++;
// 2a. Cache chưa đầy
if (cache.size() < N) {
cache.insert(current_tool);
}
// 2b. Cache đã đầy -> Phải thay thế
else {
int tool_to_remove = -1;
// Chỉ số xa nhất của lần sử dụng tiếp theo
int max_next_use = -1; // -1 đại diện cho việc không bao giờ dùng lại
// Thuật toán Tham lam Tối ưu:
// Chọn dụng cụ trong cache có lần sử dụng tiếp theo xa nhất (max_next_use lớn nhất)
for (int tool : cache) {
// Tìm lần sử dụng tiếp theo, bắt đầu từ vị trí i+1
int next_use = find_next_use(tool, i + 1, requests);
// Nếu dụng cụ không bao giờ được dùng lại (next_use == -1),
// thì nó là ứng viên tốt nhất để loại bỏ.
if (next_use == -1) {
tool_to_remove = tool;
break; // Ưu tiên tuyệt đối, dừng tìm kiếm
}
// So sánh chỉ số lần dùng tiếp theo
if (next_use > max_next_use) {
max_next_use = next_use;
tool_to_remove = tool;
}
}
// Thực hiện thay thế
if (tool_to_remove != -1) {
cache.erase(tool_to_remove);
}
cache.insert(current_tool);
}
}
// Kết quả là số lần thao tác (số lần Cache Miss)
cout << miss_count << endl;
}
int main() {
// Tối ưu hóa I/O
ios_base::sync_with_stdio(false);
cin.tie(NULL);
solve();
return 0;
}