// Nhận xét: min chỉ có thể thay đổi khi mà xuất hiện thêm cây hỏng khác
// Theo trực quan, ta cũng nên bắt đầu bao từ cái cây hỏng để maximise được cái lượng cây hỏng quét qua (minimise được cái lượng cây không hỏng được bao)
// Chứng minh:
// 1) Khi bao quanh x cái cây hỏng mà chuyển qua 1 ô kề bên thì thành x => vẫn chỉ bao quanh k - x cây không hỏng
// 2) Khi bao quanh x cái cây hỏng mà chuyển qua 1 ô kề bên thì thành x + 1 cây hỏng (+1 cây hỏng ở biên phải)
// Khi này đoạn được xét sẽ -1 cây không hỏng được bao và còn lại y nguyên => +1 cây hỏng => có lợi
// 3) Khi mà đang bao x cái cây hỏng mà chuyển qua 1 ô kề bên thì thành x - 1 cây hỏng (-1 cây hỏng ở biên trái)
// Khi này: đoạn đang bao quanh thì sẽ + 1 cây không hỏng, tổng các đoạn trước đó trừ nhiều nhất 1 cây không hỏng (do có thêm sự xuất hiện của 1 cây hỏng chưa được bao) / hoặc trường hợp tệ hơn là sẽ + >= 0 cây không hỏng nữa
// + 1 - 1 = 0 => trường hợp tốt nhất là không thay đổi
// => Ta chỉ cần dp ở các điểm mà có cây hỏng.
// 4) Thêm một điều lưu ý nữa là khi chọn điểm ở ngoài biên thì min cũng có thể thay đổi
// Cụ thể là sẽ thay đổi ở các điểm mà a[i] + k - 1 > n (bao từ a[i] và kéo dài ra k ô)
//Có thể hiểu đơn giản về việc tại sao lại không chọn a[m] + k - 1 mà lại chọn tập các điểm i là vì
//Ta có thể dùng cái biên đó để bao nhiều điểm một cách tối ưu thay vì chỉ có bao được 1 điểm duy nhất (hoang phí)
//Nếu mà chỉ bao 1 điểm và chừa ra 1 đống điểm ở giữa đó thì có khi việc bao bình thường sẽ tốn kém hơn rất nhiều, do vẫn đụng phải các cây không hỏng
//Do đó ta có thể tiết kiệm hơn bằng việc dùng cái bao ở ngoài biên đó bao nhiều cây hỏng ở trong
//Tương tự với cái ngoài biên bên trái (thực ra tui cũng có làm vậy mà tui không nhận ra do tui dùng max(0, ...))
// code DP (sub 2)
// cin >> n >> k >> m;
// for (int i = 1; i <= m; i++) {
// int x; cin >> x;
// a[x] = true;
// }
// for (int i = 1; i <= n + k; i++) sum[i] = sum[i - 1] + a[i];
// memset(minn, 0x3f, sizeof(minn));
// minn[0] = 0;
// for (int i = 1; i <= n + k; i++) {
// f[i] = minn[max(0, i - k)] + min(n, i) - max(1, min(n, i - k + 1)) + 1 - (sum[i] - sum[max(0, i - k)]);
// if (a[i]) minn[i] = f[i];
// else minn[i] = min(minn[i - 1], f[i]);
// }
// for (int i = 1; i <= n + k; i++) cerr << minn[i] << " ";
// cout << n - m - minn[n + k];
//sub 3
cin>> n >> k >> m;
int original_m = m;
for(int i =1; i <= m; i++)cin>> a[i];
sort(a +1, a +1+ m);
for(int i =1; i <= original_m; i++)if(a[i]+ k -1> n){
a[m +1]= a[i]+ k -1;
m++;
}
memset(minn, 0x3f, sizeof(minn));
minn[0]=0;
for(int i =1; i <= m; i++){
int x = max(0, int(upper_bound(a +1, a +1+ m, a[i]- k)- a -1));//ở vị trí a[i] - k đã bao được bao nhiêu cây không hỏng