import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
// 单调队列,类似于滑动窗口
public class MAX最值差 {
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String[] s=br.readLine().split(" ");
int n=Integer.parseInt(s[0]);
int k=Integer.parseInt(s[1]);
int[] a=new int[n+1];
s=br.readLine().split(" ");
for(int i=1;i<=n;i++) {
a[i]=Integer.parseInt(s[i-1]);
}
List<Integer> l=new ArrayList<>();
List<Integer> r=new ArrayList<>();
Deque<Integer> q=new ArrayDeque();
for(int i=1;i<=n;i++) {
//先退休
if(!q.isEmpty()&&q.peekFirst()<i-k) q.pollFirst();
//再弱肉强食
while(!q.isEmpty()&&a[q.peekLast()]>a[i]) q.pollLast();
q.addLast(i);
l.add(q.peekFirst());
}
q.clear();
for(int i=1;i<=n;i++) {
//先退休
if(!q.isEmpty()&&q.peekFirst()<i-k) q.pollFirst();
//再弱肉强食
while(!q.isEmpty()&&a[q.peekLast()]<a[i]) q.pollLast();
//获取队列中最小的值
q.addLast(i);
//将退休的值写进list,
r.add(q.peekFirst());
}
int ans=0;
for(int i=0;i<l.size();i++) {
ans=Math.max(ans, a[r.get(i)]-a[l.get(i)]);
}
System.out.println(ans);
}
}