#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define pii pair , pair > #define ll long long #define N (int)(1e5+10) #define mod 1000000007 #define mp make_pair #define pb push_back #define nd second #define st first #define inf mod #define endl '\n' #define sag (sol+1) #define sol (root*2) #define ort (bas+son)/2 #define bit(x,y) ((x>>y)&1) #define next sjkdfjskd int i,j,k,n,m,x,y,z,A[N]; pii St[4*N]; int AA[4*N]; int next[N][35][2],last[35][2]; pii merge(pii x,pii y){ return mp(mp(x.st.st | y.st.st , min(x.st.nd,y.st.nd)) ,mp(x.nd.st & y.nd.st , max(x.nd.nd,y.nd.nd)) ); } void init(int root,int bas,int son){ if(bas == son){ St[root].st.st = St[root].st.nd = St[root].nd.st = St[root].nd.nd = A[bas]; return; } init(sol,bas,ort); init(sag,ort+1,son); St[root] = merge(St[sol],St[sag]); return; } pii que(int root,int bas,int son,int x,int y){ if(bas > y or son < x) return mp(mp(0,inf),mp((1<<30)-1,0)); if(x <= bas and son <= y) return St[root]; return merge(que(sol,bas,ort,x,y),que(sag,ort+1,son,x,y)); } void upd(int root,int bas,int son,int x,int y,int t){ if(bas > y or son < x) return ; if(x <= bas and son <= y){ AA[root] = max(AA[root],t); return; } upd(sol,bas,ort,x,y,t); upd(sag,ort+1,son,x,y,t); return; } void f(int root,int bas,int son,int mx){ mx = max(mx , AA[root]); if(bas == son){ printf("%d\n",mx); return; } f(sol,bas,ort,mx); f(sag,ort+1,son,mx); } bool ok(int i,int x){ // cout << i << ' '<< x << endl; pii t = que(1,1,n,i,x); // cout << t.st.st << ' ' << t.st.nd << ' '<< t.nd.st << ' '<< t.nd.nd << endl; return t.st.st+t.st.nd-t.nd.st-t.nd.nd>=k; } int main(){ cin >> n >> k; for(i=1 ; i<=n ; i++) cin >> A[i]; init(1,1,n); memset(AA,-1,sizeof AA); for(j=0 ; j<30 ; j++) last[j][0] = last[j][1] = n; for(i=n ; i>=1 ; i--){ for(j=0 ; j<30 ; j++){ next[i][j][0] = last[j][0]; next[i][j][1] = last[j][1]; if(bit(A[i],j)) last[j][1] = i; else last[j][0] = i; } } vector v; for(i=1 ; i<=n ; i++){ v.clear(); v.pb(i); v.pb(n); for(j=0 ; j<30 ; j++){ v.pb(next[i][j][0]); v.pb(next[i][j][1]); } sort(v.begin(),v.end()); //return 0; int t = -1,t2 = n; for(j=v.size()-1 ; j>=0 ; j--){ int x = v[j]; if(x == n+1) continue; if(ok(i,x)){ t = x; break; } t2 = x-1; } if(t != -1){ int bas = t; int son = t2; while(bas < son){ int orta = (bas+son)/2; if(bas == orta) orta++; if(ok(i,orta)) bas = orta; else son = orta-1; } // cout << i << ' ' << bas << endl; upd(1,1,n,i,bas,bas-i+1); } } f(1,1,n,-1); }