/// In The Name Of God #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,sse3,sse4,popcnt,abm,mmx") #include #define f first #define s second #define pb push_back #define pp pop_back #define mp make_pair #define sz(x) (int)x.size() #define sqr(x) ((x) * 1ll * (x)) #define all(x) x.begin(), x.end() #define Kazakhstan ios_base :: sync_with_stdio(0), cin.tie(0), cout.tie(0); #define nl '\n' #define ioi exit(0); typedef long long ll; typedef long double ld; typedef unsigned long long ull; const int N = (int)1e5 + 7, inf = (int)1e9 + 7, mod = (int)1e9 + 7; const ll linf = (ll)1e18 + 7; const int dx[] = {-1, 0, 1, 0, 1, -1, -1, 1}, dy[] = {0, 1, 0, -1, 1, -1, 1, -1}; using namespace std; int n, k; int a[N], ans[N]; //vector < pair > add[N], del[N]; struct node { int f1, f2, f3, f4; node() {} node(int f1, int f2, int f3, int f4) : f1(f1), f2(f2), f3(f3), f4(f4) {} }; node operator + (node l, node r) { return node(max(l.f1, r.f1), min(l.f2, r.f2), l.f3 | r.f3, l.f4 & r.f4); } struct tree { int t[4][17][N], lg[N]; tree() { for (int i = 2; i < N; i++) { lg[i] = lg[i >> 1] + 1; } } void build() { for (int i = 1; i <= n; i++) { for (int j = 0; j < 4; j++) { t[j][0][i] = a[i]; } } for (int i = 1; i <= lg[n]; i++) { for (int j = 1; j + (1 << i) - 1 <= n; j++) { t[0][i][j] = max(t[0][i - 1][j], t[0][i - 1][j + (1 << (i - 1))]); t[1][i][j] = min(t[1][i - 1][j], t[1][i - 1][j + (1 << (i - 1))]); t[2][i][j] = t[2][i - 1][j] | t[2][i - 1][j + (1 << (i - 1))]; t[3][i][j] = t[3][i - 1][j] & t[3][i - 1][j + (1 << (i - 1))]; } } } node get(int l, int r) { int len = lg[r - l + 1]; node res; res.f1 = max(t[0][len][l], t[0][len][r - (1 << len) + 1]); res.f2 = min(t[1][len][l], t[1][len][r - (1 << len) + 1]); res.f3 = t[2][len][l] | t[2][len][r - (1 << len) + 1]; res.f4 = t[3][len][l] & t[3][len][r - (1 << len) + 1]; return res; } int calc(int l, int r) { node now = get(l, r); return (now.f3 - now.f4) - (now.f1 - now.f2); } } t; int u[N << 2]; void f(int &x, int y) { x = max(x, y); } void upd(int l, int r, int x, int v = 1, int tl = 1, int tr = n) { if (l <= tl && tr <= r) { f(u[v], x); return; } if (tl > r || tr < l) return; int tm = tl + tr >> 1; upd(l, r, x, v << 1, tl, tm); upd(l, r, x, v << 1 | 1, tm + 1, tr); } void build(int v = 1, int tl = 1, int tr = n) { if (tl == tr) { ans[tl] = u[v]; return; } int tm = tl + tr >> 1; f(u[v << 1], u[v]); f(u[v << 1 | 1], u[v]); build(v << 1, tl, tm); build(v << 1 | 1, tm + 1, tr); } int32_t main() { #ifdef IOI2018 freopen ("in.txt", "r", stdin); #endif Kazakhstan cin >> n >> k; for (int i = 1; i <= n; i++) { cin >> a[i]; ans[i] = -1; } int tmr = 0; t.build(); memset(u, -1, sizeof(u)); for (int i = 1; i <= n; i++) { for (int j = i; j <= n; ) { int now = t.calc(i, j); int l = j + 1, r = n, res = j; while (l <= r) { int mid = l + r >> 1; if (t.calc(i, mid) == now) res = mid, l = mid + 1; else r = mid - 1; } if (now >= k) upd(i, r, r - i + 1); j = res + 1; } } build(); for (int i = 1; i <= n; i++) { cout << ans[i] << nl; } ioi }