#include using namespace std; #define ll long long #define db double #define up(i,j,n) for (int i = j; i <= n; i++) #define down(i,j,n) for (int i = j; i >= n; i--) #define cadd(a,b) a = add (a, b) #define cpop(a,b) a = pop (a, b) #define cmul(a,b) a = mul (a, b) #define pr pair #define fi first #define se second #define SZ(x) (int)x.size() #define bin(i) (1 << (i)) #define Auto(i,node) for (int i = LINK[node]; i; i = e[i].next) template inline void cmax(T & x, T y){y > x ? x = y : 0;} template inline void cmin(T & x, T y){y < x ? x = y : 0;} const int MAXN = 2e5 + 5; const int oo = 0x3f3f3f3f; int N, M, a[MAXN], mn[MAXN][25], mx[MAXN][25]; int lg[MAXN], mask[MAXN][35][2], pos[35][2], cnt = 0; int num[MAXN], top = 0; struct Key { int o, v, f; bool operator < (const Key &x) const { return o < x.o; } }key[MAXN]; vector S[MAXN][2]; multiset now; int getmx(int le, int ri){ int len = lg[ri - le + 1]; return max(mx[le][len], mx[ri - bin(len) + 1][len]); } int getmn(int le, int ri){ int len = lg[ri - le + 1]; return min(mn[le][len], mn[ri - bin(len) + 1][len]); } void Work(int v, int L, int MI, int R){ int le = L, ri = MI, mi; while (le + 1 < ri) { mi = (le + ri) >> 1; if (v - (getmx(mi, R) - getmn(mi, R)) >= M) ri = mi; else le = mi; } int p = -1, q = R; if (v - (getmx(ri, R) - getmn(ri, R)) >= M) p = ri; if (v - (getmx(le, R) - getmn(le, R)) >= M) p = le; if (p == -1) return; S[p][0].push_back(q - p + 1); S[q + 1][1].push_back(q - p + 1); } int main(){ scanf("%d%d", &N, &M); up (i, 1, N) scanf("%d", &a[i]); up (i, 1, N) mx[i][0] = mn[i][0] = a[i]; up (j, 1, 20) up (i, 1, N) if (i + bin(j) - 1 <= N) { mx[i][j] = max(mx[i][j - 1], mx[i + bin(j - 1)][j - 1]); mn[i][j] = min(mn[i][j - 1], mn[i + bin(j - 1)][j - 1]); } int o = 0; up (i, 1, N) { if (bin(o + 1) <= i) o++; lg[i] = o; } up (i, 1, N) { up (j, 0, 30) { int v = (a[i] >> j & 1); pos[j][v] = i; } up (j, 0, 30) up (k, 0, 1) mask[i][j][k] = pos[j][k]; } up (i, 1, N) { cnt = 0; int cur = i, val = 0; while (cur) { int nxt = 0, sum = 0; up (j, 0, 30) if ((val & bin(j)) == 0) { if (mask[cur][j][1] > nxt) { nxt = mask[cur][j][1]; sum = bin(j); }else if (mask[cur][j][1] == nxt) { sum |= bin(j); } } cnt++; key[cnt].o = nxt; key[cnt].v = sum; key[cnt].f = 1; cur = nxt; val ^= sum; } cur = i; val = a[i]; while (cur) { int nxt = 0, sum = 0; up (j, 0, 30) if (val & bin(j)) { if (mask[cur][j][0] > nxt) { nxt = mask[cur][j][0]; sum = bin(j); }else if (mask[cur][j][0] == nxt) { sum |= bin(j); } } cnt++; key[cnt].o = nxt; key[cnt].v = sum; key[cnt].f = 2; cur = nxt; val ^= sum; } sort(key + 1, key + cnt + 1); top = 0; up (j, 1, cnt) num[++top] = key[j].o; sort(num + 1, num + top + 1); top = unique(num + 1, num + top + 1) - (num + 1); int OR = a[i], AND = a[i]; cur = cnt; down (j, top, 1) { if (num[j] == 0) continue; while (cur && key[cur].o >= num[j]) { if (key[cur].f == 1) { OR |= key[cur].v; }else AND ^= key[cur].v; cur--; } Work(OR - AND, num[j - 1] + 1, num[j], i); } } up (i, 1, N) { up (j, 0, SZ(S[i][1]) - 1) now.erase(now.find(S[i][1][j])); up (j, 0, SZ(S[i][0]) - 1) now.insert(S[i][0][j]); printf("%d\n", now.empty() ? -1 : (*now.rbegin())); } return 0; }