/*
    題意:給出一個(gè)序列,求最長(zhǎng)的連續(xù)子序列,使得 M<=Max-Min<=K
    n <= 10^5
    一開(kāi)始我把Max-Min合起來(lái)弄,搞不出
    然后看了別人說(shuō)用兩個(gè)單調(diào)隊(duì)列,一個(gè)存單調(diào)遞減,一個(gè)存單調(diào)遞增
    想了下細(xì)節(jié),1y,有點(diǎn)驚奇..

    我知道單調(diào)隊(duì)列可以快速知道i及之前的最大/小值,這道題分開(kāi)兩個(gè)隊(duì)列來(lái)做很好!!

    Max - Min 為兩個(gè)隊(duì)列的隊(duì)首之差
    while(Max-Min>K) 看哪個(gè)的隊(duì)首元素比較前就移動(dòng)誰(shuí)的

    最后求長(zhǎng)度時(shí),需要先記錄上一次的被淘汰的最值位置last ,這樣[last+1,i]即為滿足條件的連續(xù)子序列了
    i - last
*/

#include
<cstdio>
#include
<cstring>
#include
<algorithm>

using namespace std;

inline 
int min(int a ,int b){return a<b?a:b;}
inline 
int max(int a ,int b){return a>b?a:b;}

const int MAXN = 100010;

int a[MAXN];
int DQ1[MAXN],DQ2[MAXN];//Max, Min

int main()
{
    
//freopen("in","r",stdin);
    int N,M,K;
    
while(~scanf("%d%d%d",&N,&M,&K))
    
{
        
for(int i=1;i<=N;i++)
            scanf(
"%d",&a[i]);
        
int ans = 0;
        
int front1 = 0,tail1 = 0;
        
int front2 = 0,tail2 = 0;
        
int last1 = 0,last2 = 0;
        
for(int i=1;i<=N;i++)
        
{
            
//Max
            while(front1<tail1 && a[DQ1[tail1-1]]<=a[i])tail1--;
            DQ1[tail1
++= i;
            
//Min
            while(front2<tail2 && a[DQ2[tail2-1]]>=a[i])tail2--;
            DQ2[tail2
++= i;

            
while(a[DQ1[front1]]-a[DQ2[front2]] > K)
            
{
                
if(DQ1[front1]<DQ2[front2])last1 = DQ1[front1++];
                
else last2 = DQ2[front2++];
            }

            
if(a[DQ1[front1]]-a[DQ2[front2]]>=M)
                ans 
= max(ans,i-max(last1,last2));//取較大值
        }

        printf(
"%d\n",ans);
    }

    
return 0;
}