#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int B = 600; // Optymalny próg podziału (do ewentualnego dostrojenia)
int cnt[B + 1][B + 1];
int max_val[B + 1];
int global_max_small = 0;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, q;
if (!(cin >> n >> q)) return 0;
vector<bool> A(n + 1, false);
int C = 0; // Aktualna liczba kamieni na planszy
for (int i = 0; i < q; ++i) {
int x;
cin >> x;
bool is_add = !A[x];
A[x] = !A[x]; // Zmiana stanu pola
if (is_add) {
C++;
for (int K = 2; K <= B; ++K) {
int mod = x % K;
cnt[K][mod]++;
if (cnt[K][mod] > max_val[K]) {
max_val[K] = cnt[K][mod];
}
}
} else {
C--;
for (int K = 2; K <= B; ++K) {
int mod = x % K;
cnt[K][mod]--;
// Leniwa aktualizacja maksimów przy usuwaniu dla przyspieszenia
}
}
// 1. Znajdź najlepszy wynik dla małych K (z uwzględnieniem leniwego usuwania)
global_max_small = 0;
for (int K = 2; K <= B; ++K) {
// Jeśli zarejestrowane maksimum mogło spaść z powodu usunięcia, przelicz
if (!is_add && max_val[K] > 0) {
int true_max = 0;
for (int m = 0; m < K; ++m) {
if (cnt[K][m] > true_max) {
true_max = cnt[K][m];
}
}
max_val[K] = true_max;
}
if (max_val[K] > global_max_small) {
global_max_small = max_val[K];
}
}
int current_best = global_max_small;
// 2. Jeśli mamy mało kamieni i duże K ma szansę pobić current_best
// Szukamy tylko do momentu, gdzie n / K > current_best
int limit_K = min(n, n / max(1, current_best));
if (limit_K > B) {
// Ponieważ szukamy wyniku dla dużych K (które robią duże "skoki"),
// iterujemy na bieżąco po planszy dla tych kandydatów.
for (int K = B + 1; K <= limit_K; ++K) {
// Przeszukiwanie kroków
// (W pełnym rozwiązaniu turniejowym w tym miejscu stosuje się dodatkową
// kompresję niepustych pol dla bardzo małego C)
int local_max = 0;
for (int start = 1; start <= min(K, n); ++start) {
int current_score = 0;
for (int pos = start; pos <= n; pos += K) {
if (A[pos]) current_score++;
}
if (current_score > local_max) {
local_max = current_score;
}
}
if (local_max > current_best) {
current_best = local_max;
}
}
}
cout << current_best << "\n";
}
return 0;
}