#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
if (!(cin >> n >> k)) return 0;
vector<int> a(k + 1);
int maxId = 0;
for (int i = 1; i <= k; ++i) {
cin >> a[i];
maxId = max(maxId, a[i]);
}
// nextPos[i] = vị trí xuất hiện tiếp theo của a[i] sau i (hoặc INF)
vector<int> nextPos(k + 1, INF);
vector<int> lastOcc(maxId + 1, INF);
for (int i = k; i >= 1; --i) {
nextPos[i] = lastOcc[a[i]];
lastOcc[a[i]] = i;
}
// Danh sách các id thực sự xuất hiện
vector<int> appears;
vector<char> seen(maxId + 1, 0);
for (int i = 1; i <= k; ++i) {
if (!seen[a[i]]) { appears.push_back(a[i]); seen[a[i]] = 1; }
}
int m = maxId + 1;
// pos[id] = bậc hiện tại của dụng cụ id (0..n)
vector<int> pos(m, 0);
// curNext[id] = chỉ số lần xuất hiện tiếp theo (hoặc INF)
vector<int> curNext(m, INF);
// init curNext bằng first occurrence (lastOcc currently chứa first occ after the build? we set below)
for (int id : appears) curNext[id] = lastOcc[id]; // lastOcc now holds first occurrence index
// Mỗi bậc lưu set các cặp (nextOcc, id) sắp tăng dần. Muốn chọn evict = phần tử có next lớn nhất -> rbegin.
vector< set<pair<int,int>> > level(n + 1);
// Mỗi dụng cụ có iterator tới vị trí trong set để xóa nhanh
vector< set<pair<int,int>>::iterator > iterOf(m);
// Khởi tạo: tất cả công cụ xuất hiện ban đầu ở level 0
for (int id : appears) {
auto it = level[0].insert({curNext[id], id}).first;
iterOf[id] = it;
pos[id] = 0;
}
long long ops = 0;
// Xử lý lần lượt các yêu cầu
for (int t = 1; t <= k; ++t) {
int x = a[t];
// Cập nhật next cho công cụ x: từ next = t (đang dùng) -> nextPos[t]
// Xóa và chèn lại với khóa mới ở set của pos[x]
int oldNext = curNext[x];
int newNext = nextPos[t];
curNext[x] = newNext;
// remove old
level[pos[x]].erase(iterOf[x]);
// reinsert with new key
iterOf[x] = level[pos[x]].insert({curNext[x], x}).first;
// Nếu đang ở bậc n thì đã sẵn sàng, không cần di chuyển
if (pos[x] == n) continue;
// Di chuyển x dần lên đến bậc n
for (int l = pos[x]; l < n; ++l) {
// ensure we can insert into level l+1: if level[l+1] size == 2, evict one to l
if ((int)level[l+1].size() == 2) {
// evict the one with largest curNext -> rbegin
auto itEv = prev(level[l+1].end());
int y_next = itEv->first;
int y = itEv->second;
// remove from l+1
level[l+1].erase(itEv);
// insert y into level l
auto itIns = level[l].insert({curNext[y], y}).first;
iterOf[y] = itIns;
pos[y] = l;
}
// Now move x from l -> l+1
// remove x from level l
level[l].erase(iterOf[x]);
// insert into level l+1
auto itNew = level[l+1].insert({curNext[x], x}).first;
iterOf[x] = itNew;
pos[x] = l + 1;
ops += 1; // một thao tác cho mỗi bước cạnh
}
// x đã ở bậc n
}
// Sau khi phục vụ xong các yêu cầu, phải chuyển tất cả về sàn (bậc 0)
// Mỗi dụng cụ ở bậc p cần p thao tác để xuống bậc 0 (có thể mô tả bằng cascade, tổng bằng tổng pos).
long long sumPos = 0;
for (int id : appears) sumPos += pos[id];
ops += sumPos;
cout << ops << "\n";
return 0;
}