#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;
}