/**
* author: orzvanh14 ( )
* created: 23.12.2022 10:08:02
**/
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define nn "\n"
const int N = 1e6 + 5;
int sz[N], par[N];
int n, k;
void make_set(int a){
par[a] = a;
sz[a] = 1;
}
int get(int v){
if(v == par[v]) return v;
return par[v] = get(par[v]);
}
void union_sets(int a, int b){
a = get(a);
b = get(b);
if(a != b){
par[b] = a;
sz[a] += sz[b];
}
}
void solve(){
if (!(cin >> n >> k)) return;
// Có N + 1 nếp gấp đánh số từ 0 đến N
for(int i = 0; i <= n; i++) {
make_set(i);
}
int l = 0, r = n;
for(int i = 1; i <= k; i++){
int x;
cin >> x;
x = get(x); // Lấy đại diện hiện tại của vị trí x
int left_len = x - l;
int right_len = r - x;
// Phần ngắn hơn sẽ được gấp chồng lên phần còn lại
// Nếu hai phần bằng nhau (left_len == right_len), gấp bên trái lên bên phải
if(left_len <= right_len){
// Gấp phần bên trái [l, x] sang bên phải qua trục x
for(int i = l; i <= x; i++){
int u = get(i);
int v = get(2 * x - i); // Điểm đối xứng qua x
if (u != v) {
union_sets(v, u); // Gộp vào phía bên phải
}
}
l = x + 1; // Biên trái dịch chuyển sau khi phần bên trái đã bị gấp chồng lên
} else {
// Gấp phần bên phải [x, r] sang bên trái qua trục x
for(int i = x; i <= r; i++){
int u = get(i);
int v = get(2 * x - i); // Điểm đối xứng qua x
if (u != v) {
union_sets(v, u); // Gộp vào phía bên trái
}
}
r = x - 1; // Biên phải dịch chuyển sau khi phần bên phải đã bị gấp chồng lên
}
}
// In kết quả ra file BANDO.OUT
cout << r - l + 1 << nn;
for(int i = l; i <= r; i++){
cout << sz[get(i)] << " ";
}
cout << nn;
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}