Description


Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值。耍畸形一个人是不行的,于是他找到了你。


Input


输入:第一行两个有空格隔开的整数k(0<=k<=2000,000,000),n(1<=n<=3000,000),k代表Tz设定的最大值,n代表难度序列的长度。第二行为n个由空格隔开的整数ai(1<=ai<=2000,000,000),表示难度序列。


Output


输出:最大的字串长度。


Sample Input


3 9
5 1 3 5 8 6 6 9 10


Sample Output


4
(有两个子串的长度为4: 5, 8, 6, 6 和8, 6, 6, 9.最长子串的长度就是4)


HINT






​传送门​


任意两个数的差值不超过K,其实就是最大值减去最小值不超过K。


用两个单调队列,分别维护增、减(最大、最小)


然后当最大值和最小值差值大于K,每次找出最大值位置t1,最小值位置t2,


那么选择t1,t2中更小的那一个弹出来维护队首,


不断操作直到差值<=K位置。


然后计算ans即可。O(N)




其实还可以st表+二分来做。。O(nlogn)


但是空间开不下……








#include<bits/stdc++.h>
using namespace std;
int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0' || ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int
N=3000005;
int K,n,a[N];
int qmin[N],qmax[N];
int main(){
K=read(),n=read();
int h1,t1,h2,t2,t=0,ans=1;
h1=h2=t1=t2=qmin[1]=qmax[1]=1;
a[1]=read();
for (int i=2;i<=n;i++){
a[i]=read();
while (h1<=t1 && a[i]<a[qmin[t1]]) t1--;
while (h2<=t2 && a[i]>a[qmax[t2]]) t2--;
qmin[++t1]=qmax[++t2]=i;
while (a[qmax[h2]]-a[qmin[h1]]>K)
if (qmin[h1]<qmax[h2]) t=qmin[h1],h1++;
else t=qmax[h2],h2++;
ans=max(ans,i-t);
}
printf("%d\n",ans);
return 0;
}