/*
开始以为是二分...后来发现丫不单调...
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000010
using namespace std;
int n,l,r,ans,tmin[maxn],tmax[maxn],a[maxn];
int qmin[maxn],qmax[maxn],headmin,tailmin,headmax,tailmax;
int ansmin[maxn],ansmax[maxn],lm;
int init()
{
int f=1,x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
return x*f;
}
int Judge(int k)
{
int x;lm=0;int falg=0;
tailmin=0;headmin=1;
tailmax=0;headmax=1;
for(int i=1;i<=k-1;i++)
{
x=a[i];
while(x>qmax[tailmax]&&tailmax>0)
{tailmax--;if(tailmax<headmax&&headmax>1)headmax--;}
qmax[++tailmax]=x;tmax[tailmax]=i;
if(i-tmax[headmax]+1>k)headmax++;
while(x<qmin[tailmin]&&tailmin>0)
{tailmin--;if(tailmin<headmin&&headmin>1)headmin--;}
qmin[++tailmin]=x;tmin[tailmin]=i;
if(i-tmin[headmin]+1>k)headmin++;
}
for(int i=k;i<=n;i++)
{
x=a[i];
while(x>qmax[tailmax]&&tailmax>0)
{tailmax--;if(tailmax<headmax&&headmax>1)headmax--;}
qmax[++tailmax]=x;tmax[tailmax]=i;
if(i-tmax[headmax]+1>k)headmax++;
ansmax[++lm]=qmax[headmax];
while(x<qmin[tailmin]&&tailmin>0)
{tailmin--;if(tailmin<headmin&&headmin>1)headmin--;}
qmin[++tailmin]=x;tmin[tailmin]=i;
if(i-tmin[headmin]+1>k)headmin++;
ansmin[lm]=qmin[headmin];
}
for(int i=1;i<=lm;i++)
{
int tmp=ansmax[i]-ansmin[i];
if(tmp>=l&&tmp<=r){falg=1;break;}
}
return falg;
}
int main()
{
while(~scanf("%d%d%d",&n,&l,&r))
{
for(int i=1;i<=n;i++)a[i]=init();
int li=0,ri=n;ans=0;
while(li<=ri)
{
int mid=(li+ri)/2;
if(!Judge(mid))
{
ans=max(ans,mid);
li=mid+1;
}
else ri=mid-1;
}
printf("%d\n",ans);
}
return 0;
}
/*
开始想的是直接单调队列 but 最大最小值的所在序列不确定
不能搞出长度 不好办
其实可以维护出来的 对于序列的右端点是确定的 是i
而左端点开始默认是1 不断更新就好了
考虑超出r的 设于队头的元素的位置分别为pmax pmin
不断删除队头 并更新n指针 直到在范围里
这是 指针位置就是序列的左端点
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000010
using namespace std;
int n,l,r,ans,tmin[maxn],tmax[maxn],a[maxn];
int qmin[maxn],qmax[maxn],headmin,tailmin,headmax,tailmax;
int init()
{
int f=1,x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
return x*f;
}
void Solve()
{
int x,now=1;
tailmin=0;headmin=1;
tailmax=0;headmax=1;
for(int i=1;i<=n;i++)
{
x=a[i];
while(x>qmax[tailmax]&&tailmax>=headmax)tailmax--;
qmax[++tailmax]=x;tmax[tailmax]=i;
while(x<qmin[tailmin]&&tailmin>=headmin)tailmin--;
qmin[++tailmin]=x;tmin[tailmin]=i;
while(headmin<=tailmin&&headmax<=tailmax&&qmax[headmax]-qmin[headmin]>r)
{
if(tmax[headmax]<=tmin[headmin]){now=tmax[headmax]+1;headmax++;}
else {now=tmin[headmin]+1;headmin++;}
}
if(qmax[headmax]-qmin[headmin]>=l)ans=max(ans,i-now+1);
}
}
int main()
{
while(~scanf("%d%d%d",&n,&l,&r))
{
for(int i=1;i<=n;i++)a[i]=init();
ans=0;Solve();
printf("%d\n",ans);
}
return 0;
}