1 #include"bits/stdc++.h" 2 using namespace std; 3 4 int n,k; 5 int dp[3000006][23]; 6 int dp2[3000006][23]; 7 8 int query(int l,int r,int type) 9 { 10 int ss=log2(r-l+1); 11 if (type) return max(dp[l][ss],dp[r-(1<<ss)+1][ss]); // r-(1<<ss) !!+1 12 else return min(dp2[l][ss],dp2[r-(1<<ss)+1][ss]); 13 } 14 15 16 int check(int mid) 17 { 18 for (int i=1;i+mid-1<=n;i++) 19 { 20 if (1ll*abs(query(i,i+mid-1,1)-query(i,i+mid-1,0))<=1LL*k)return 1; // i ,i+mid-1(!!<--) 21 } 22 return 0; 23 } 24 int main() 25 { 26 //cout<<(int)pow(2,22); 27 scanf("%d%d",&k,&n); 28 for (int i=1;i<=n;i++)scanf("%d",&dp[i][0]),dp2[i][0]=dp[i][0]; 29 for (int i=1;i<=21;i++) 30 { 31 for (int j=1;j+(1<<i)-1<=n;j++) 32 { 33 dp[j][i]=max(dp[j+(1<<(i-1))][i-1],dp[j][i-1]);//j+(1<<(i-1)) 34 dp2[j][i]=min(dp2[j+(1<<(i-1))][i-1],dp2[j][i-1]); 35 } 36 } 37 38 // cout<<query(4,7,1); 39 40 int l=1,r=n; int ans ; 41 while (l<=r) 42 { 43 int mid = l+r>>1; //cout<<mid<<endl; 44 if (check(mid))ans=mid,l=mid+1;else r=mid-1; 45 } 46 47 cout<<ans; 48 }