#include using namespace std; #define N 5000 #define LEFT(x) (2 * x) #define RIGHT(x) (2 * x + 1) #define INF 0x3f3f3f3f struct Node{ long long _max, _min, _or, _and; Node(){} Node(long long _max, long long _min, long long _or, long long _and){ this->_max = _max; this->_min = _min; this->_or = _or; this->_and = _and; } }; Node seg[4 * N + 1]; long long c[N + 1][N + 1]; long long a[N + 1]; int ans[N + 1]; long long k; int n; Node merge(Node &nl, Node &nr){ Node n; n._max = max(nl._max, nr._max); n._min = min(nl._min, nr._min); n._or = nl._or | nr._or; n._and = nl._and & nr._and; return n; } void build(int cur, int l, int r){ int m = (l + r) / 2; if (l == r){ seg[cur] = Node(a[l], a[l], a[l], a[l]); return; } build(LEFT(cur), l, m); build(RIGHT(cur), m + 1, r); seg[cur] = merge(seg[LEFT(cur)], seg[RIGHT(cur)]); } Node query(int cur, int l, int r, int i, int j){ int m = (l + r) / 2; Node nl, nr; if (l > j or r < i){ return Node(-INF, INF, 0ll, -1ll); } if (l >= i and r <= j){ return seg[cur]; } nl = query(LEFT(cur), l, m, i, j); nr = query(RIGHT(cur), m + 1, r, i, j); return merge(nl, nr); } long long cost(Node n){ return (n._or - n._and) - (n._max - n._min); } int main(){ int i, j, l, r; scanf("%d%lld", &n, &k); for (i = 1; i <= n; i++){ scanf("%lld", a + i); } build(1, 1, n); memset(ans, -1, sizeof(ans)); for (i = 1; i <= n; i++){ for (j = i; j <= n; j++){ c[i][j] = cost(query(1, 1, n, i, j)); } } for (i = 1; i <= n; i++){ for (l = 1; l <= i; l++){ for (r = i; r <= n; r++){ if (c[l][r] >= k){ ans[i] = max(ans[i], r - l + 1); } } } } for (i = 1; i <= n; i++){ printf("%d\n", ans[i]); } return 0; }