template <classT> inlinevoidchmin(T &x, const T &y){ if (x > y) { x = y; } } template <classT> inlinevoidchmax(T &x, const T &y){ if (x < y) { x = y; } }
constint M = 1 << 22;
int n, Q, m; int f[M]; // f[u]:是否有数的子集为 u int g[M]; // g[u]:是否有数的超集为 u
voidaddf(int u){ if (f[u]) { return; } f[u] = 1; for (int i = 0; i < m; i ++) { if (u >> i & 1) { addf(u ^ (1 << i)); } } } intaskOr(int u){ int v = 0; for (int i = m - 1; i >= 0; i --) { if (!(u >> i & 1) && f[v ^ (1 << i)]) { v ^= (1 << i); } } return v | u; }
voidaddg(int u){ if (u >= (1 << m) || g[u]) { return; } g[u] = 1; for (int i = 0; i < m; i ++) { if (!(u >> i & 1)) { addg(u ^ (1 << i)); } } } intaskAnd(int u){ int v = (1 << m) - 1; for (int i = m - 1; i >= 0; i --) { if ((u >> i & 1) && g[v ^ (1 << i)]) { v ^= (1 << i); } } return v & u; }
voidwork(){ std::cin >> n >> Q;
m = 1; while ((1 << m) < n) { m ++; }
int lastans = 0; for (int i = 1; i <= Q; i ++) { int u; std::cin >> u; u = (u + lastans) % n;
chmax(lastans, askOr(u) - u); addf(u);
chmax(lastans, u - askAnd(u)); addg(u);
std::cout << lastans << ' '; } std::cout << '\n';
for (int i = 0; i < (1 << m); i ++) { f[i] = g[i] = 0; } }