http://acm.hdu.edu.cn/showproblem.php?pid=3530
#include<iostream>
using namespace std;
#define N 100005
int q_max[N],head_max,tail_max;
int q_min[N],head_min,tail_min;
int n,m,k;
int a[N];
void solve(){
int ret=0;
head_max=tail_max=0;
head_min=tail_min=0;
int last1=0,last2=0;
for(int i=1;i<=n;i++){
while(head_max<tail_max&&a[ q_max[tail_max-1] ]<a[i])
tail_max--;
q_max[tail_max++]=i;
while(head_min<tail_min&&a[ q_min[tail_min-1] ]>a[i])
tail_min--;
q_min[tail_min++]=i;
while(a[ q_max[head_max] ]-a[ q_min[head_min] ]>k){
if(q_max[head_max]<q_min[head_min])
last1=q_max[head_max++];
else
last2=q_min[head_min++];
}
if(a[ q_max[head_max] ]-a[ q_min[head_min] ]>=m)
ret=max(ret,i-max(last1,last2));
}
printf("%d\n",ret);
}
int main(void){
while(~scanf("%d%d%d",&n,&m,&k)){
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
solve();
}
}