#include using namespace std; #define f(a, b) ((1 << (a)) * (b)) int n, k, y[18][100005], za[100005][30], zb[100005][30], lg[100005], wa[17][100005], wb[17][100005], lo, hi, mi, ta; vector< pair< int, int > > v, vv; int f1(int a, int b) { ta = lg[b - a]; // printf("f1 %d %d %d %d %d %d\n", a, b, ta, wa[ta][a], wa[ta][b - (1 << ta)], max(wa[ta][a], wa[ta][b - (1 << ta)])); return max(wa[ta][a], wa[ta][b - (1 << ta)]); } int f2(int a, int b) { ta = lg[b - a]; return min(wb[ta][a], wb[ta][b - (1 << ta)]); } void f3(int a, int b, int c, int d) { if (a == f(c, d) && b == f(c, d + 1)) { y[c][d] = max(y[c][d], ta); return; } c--; d = d * 2 + 1; if (b <= f(c, d)) f3(a, b, c, d - 1); else if (a >= f(c, d)) f3(a, b, c, d); else f3(a, f(c, d), c, d - 1), f3(f(c, d), b, c, d); } int main() { scanf("%d%d", &n, &k); for (int i = 0; i < n; i++) { scanf("%d", wa[0] + i); wb[0][i] = wa[0][i]; } lg[1] = 0; for (int i = 2; i <= n; i++) lg[i] = lg[i / 2] + 1; for (int i = 1; i < 17; i++) for (int j = 0; j + (1 << i) <= n; j++) { wa[i][j] = max(wa[i - 1][j], wa[i - 1][j + (1 << (i - 1))]); wb[i][j] = min(wb[i - 1][j], wb[i - 1][j + (1 << (i - 1))]); } for (int i = n - 1; i >= 0; i--) { for (int j = 0; j < 30; j++) if (wa[0][i] & (1 << j)) { za[i][j] = i; zb[i][j] = i == n - 1 ? n : zb[i + 1][j]; } else { za[i][j] = i == n - 1 ? n : za[i + 1][j]; zb[i][j] = i; } } for (int i = 0; i < n; i++) { v.clear(); v.push_back(make_pair(n, 0)); for (int j = 0; j < 30; j++) { v.push_back(make_pair(za[i][j], 1 << j)); v.push_back(make_pair(zb[i][j], 1 << j)); } sort(v.begin(), v.end()); vv = vector< pair< int, int > >(1, make_pair(i, -((1 << 30) - 1))); for (int j = 0; j < v.size(); j++) { if (v[j].first != vv.back().first) vv.push_back(make_pair(v[j].first, vv.back().second)); vv.back().second += v[j].second; } // for (int j = 0; j < v.size(); j++) printf("(%d,%d)%c", v[j].first, v[j].second, j == v.size() - 1 ? '\n' : ' '); // for (int j = 0; j < vv.size(); j++) printf("(%d,%d)%c", vv[j].first, vv[j].second, j == vv.size() - 1 ? '\n' : ' '); for (int j = (int)vv.size() - 2; j >= 0; j--) if (vv[j].second - (f1(i, vv[j].first + 1) - f2(i, vv[j].first + 1)) >= k) { // printf("%d,%d %d %d\n", vv[j].first, vv[j + 1].first, f1(i, vv[j].first + 1), f2(i, vv[j].first + 1)); lo = vv[j].first + 1; hi = vv[j + 1].first + 1; while (lo < hi) { mi = (lo + hi) / 2; if (vv[j].second - (f1(i, mi) - f2(i, mi)) >= k) lo = mi + 1; else hi = mi; } lo--; ta = lo - i; f3(i, lo, 17, 0); break; } } for (int i = 17; i; i--) for (int j = 0; f(i, j) < n; j++) if (f(i - 1, j * 2 + 1) < n) { y[i - 1][j * 2] = max(y[i - 1][j * 2], y[i][j]); y[i - 1][j * 2 + 1] = max(y[i - 1][j * 2 + 1], y[i][j]); } else y[i - 1][j * 2] = max(y[i - 1][j * 2], y[i][j]); for (int i = 0; i < n; i++) printf("%d\n", y[0][i] ? y[0][i] : -1); return 0; }