5 0 0 1 1 1 1 1 5 0 3 1 2 3 4 5
5 4
#include<iostream>
#include<cstring>
#include<cstdio>
#include<math.h>
using namespace std;
#define maxs( a , b ) a>b?a:b
#define mins( a , b ) a>b?b:a
const int MAX_N = 110005;
int d[MAX_N];
int dpmin[MAX_N][25];
int dpmax[MAX_N][25];
int n;
void create_Dpmin(){
int i , j;
for( i = 1 ; i <= n ; i++ )
dpmin[i][0] = d[i];
for( j = 1 ; j <= log((double)(n+1))/log(2.0) ; j++ ){
for( i = 1 ; i+(1<<j)-1 <= n ; i++ ){
dpmin[i][j] = mins( dpmin[i][j-1] , dpmin[i+(1<<(j-1))][j-1] );
}
}
}
void create_Dpmax(){
int i , j;
for( i = 1 ; i <= n ; i++ )
dpmax[i][0] = d[i];
for( j = 1 ; j <= log((double)(n+1))/log(2.0) ; j++ ){
for( i = 1 ; i+(1<<j)-1 <= n ; i++ ){
dpmax[i][j] = maxs( dpmax[i][j-1] , dpmax[i+(1<<(j-1))][j-1] );
}
}
}
int getmax( int a , int b ){
int k = (int)(log((double)(b-a+1))/log(2.0));
return maxs( dpmax[a][k] , dpmax[b-(1<<k)+1][k] );
}
int getmin( int a , int b ){
int k = (int)(log((double)(b-a+1))/log(2.0));
return mins( dpmin[a][k] , dpmin[b-(1<<k)+1][k] );
}
void Init()
{
create_Dpmin();
create_Dpmax();
}
inline int Max_Min(int a,int b)
{
return getmax(a,b)-getmin(a,b);
}
int main()
{
int m,k;
while(scanf("%d%d%d",&n,&m,&k)==3)
{
for(int i = 1 ; i <= n ; i++ ) scanf("%d",&d[i]);
Init();
int now=1;
int cnt=0;
for(int i=1;i<=n;i++)
{
int temp=Max_Min(now,i);
if(temp>=m&&temp<=k)
{
int len=i-now+1;
if(len>cnt) cnt=len;
}
else if(temp<m)
{
continue;
}
else
{
now++;
}
}
printf("%d/n",cnt);
}
return 0;
}
/*
3 3 4
1 6 3
*/