/*{{{*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define SZ(X) ((int)(X).size()) #define ALL(X) (X).begin(), (X).end() #define REP(I, N) for (int I = 0; I < (N); ++I) #define REPP(I, A, B) for (int I = (A); I < (B); ++I) #define FOR(I, A, B) for (int I = (A); I <= (B); ++I) #define FORS(I, S) for (int I = 0; S[I]; ++I) #define RS(X) scanf("%s", (X)) #define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end())))) #define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin()) #define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++) #define MP make_pair #define PB push_back #define MS0(X) memset((X), 0, sizeof((X))) #define MS1(X) memset((X), -1, sizeof((X))) #define LEN(X) strlen(X) #define F first #define S second using namespace std; typedef int64_t LL; typedef uint64_t ULL; typedef long double LD; typedef pair PII; typedef vector VI; typedef vector VL; typedef vector VPII; typedef pair PLL; typedef vector VPLL; template void _R(T &x) { cin >> x; } void _R(int &x) { scanf("%d", &x); } void _R(int64_t &x) { scanf("%lld", &x); } void _R(double &x) { scanf("%lf", &x); } void _R(char &x) { scanf(" %c", &x); } void _R(char *x) { scanf("%s", x); } void R() {} template void R(T &head, U &... tail) { _R(head); R(tail...); } template void _W(const T &x) { cout << x; } void _W(const int &x) { printf("%d", x); } void _W(const int64_t &x) { printf("%lld", x); } void _W(const double &x) { printf("%.16f", x); } void _W(const char &x) { putchar(x); } void _W(const char *x) { printf("%s", x); } template void _W(const pair &x) {_W(x.F); putchar(' '); _W(x.S);} template void _W(const vector &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); } void W() {} template void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); } template void DEBUG(const T &head, const U &... tail) { #ifdef HOME _W('#'); _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); #endif } int MOD = 1e9+7; void ADD(LL& x,LL v){x=(x+v)%MOD;if(x<0)x+=MOD;} /*}}}*/ const int SIZE = 1e6+10; int v[SIZE][4],a[SIZE]; int N,K; int op(int x,int y,int ty){ if(ty==0)return x&y; if(ty==1)return x|y; if(ty==2)return min(x,y); if(ty==3)return max(x,y); return -1; } void pull(int id){ REP(i,4){ v[id][i]=op(v[id*2][i],v[id*2+1][i],i); } } int qq_type,ll,rr; int qq(int L,int R,int id){ if(L>=ll&&R<=rr){ //DEBUG('#',L,R,v[id][qq_type]); return v[id][qq_type]; } int mm=(L+R)/2; if(rr<=mm)return qq(L,mm,id*2); else if(ll>mm)return qq(mm+1,R,id*2+1); return op(qq(L,mm,id*2),qq(mm+1,R,id*2+1),qq_type); } void build(int L,int R,int id){ if(L==R){ REP(i,4)v[id][i]=a[L]; return; } int mm=(L+R)/2; build(L,mm,id*2); build(mm+1,R,id*2+1); pull(id); } multisetH; VPII semi_res[SIZE]; void solve(){ REP(i,N){ for(auto me:semi_res[i]){ if(me.S==1)H.insert(me.F); else H.erase(H.find(me.F)); } if(SZ(H))W(*H.rbegin()); else W(-1); } } int nxt[SIZE][30]; void solve0(int l_p){ VI d={N}; REP(i,30){ if(nxt[l_p][i]!=N){ d.PB(nxt[l_p][i]); } } SORT_UNIQUE(d); int far=l_p-1; REP(i,SZ(d)){ ll=l_p; int _ll=(i?d[i-1]:l_p); int left=_ll-1,right=d[i]-1; while(left=K)left=middle; else right=middle-1; } if(left>=_ll)far=max(far,left); } if(far>=l_p){ semi_res[l_p].PB(MP(far-l_p+1,1)); semi_res[far+1].PB(MP(far-l_p+1,-1)); } } int get_bit(int x,int y){ return (x>>y)&1; } int main(){ R(N,K); REP(i,N)R(a[i]); REP(j,30)nxt[N-1][j]=N; for(int j=N-1;j>0;j--){ REP(i,30)nxt[j-1][i]=nxt[j][i]; REP(i,30){ if(get_bit(a[j],i)!=get_bit(a[j-1],i))nxt[j-1][i]=j; } } build(0,N-1,1); REP(i,N){ solve0(i); } solve(); return 0; }