#include<iostream>
#include<cstdio> 
#include<cstring>
#include<algorithm>
using namespace std;
int A[1000010];
int n,c,a;
bool check(int x)//判断此答案是否可行 
{
    int num=0;
    int l=A[1];//l记录上一只牛的位置,开始时第一只牛一定在第一个牛栏 
    for(int i=2;i<=n;i++)//依次枚举每个牛栏 
    {
        if(A[i]-l<x) num++;//若此距离不满足当前答案,那么需要的牛栏数+1,即把当前牛放到下一个牛栏 
        else l=A[i];//否则就更新上一次的牛栏位置 ,即上一头牛放的位置 
        if(num>a) return false;// 若需要牛栏数大于最大牛栏数,此答案不可行 
    }
    return true;//反之,若需要牛栏数小于最大需要牛栏数,此答案可行
}
int main()
{ 
  scanf("%d%d",&n,&c);
  for(int i=1;i<=n;i++)
    scanf("%d",&A[i]);
  sort(A+1,A+n+1);//由于无序,需排序(sort默认从小到大,不用写规则) 
  a=n-c;//最大剩余牛栏数 
  int l=1;//二分的左界,从1开始,即可能情况的最小值 
  int r=A[n]-A[1];//二分右界,即可能情况的最大值 
  while(l+1<r)//若左<右,则继续二分答案 
  {
      int mid=(l+r)/2;//二分 两区间分别为l ~ mid    ,     mid ~ r;
      if(check(mid)) l=mid;//若此答案可行,从mid ~ r区间继续查找(更大答案),即修改左界l=mid 
      else r=mid;//反之,若此答案不可行,从l ~ mid区间查找(合理答案),即修改左界l=mid 
  }
  if(check(r)) printf("%d",r);//若可行解为右界,输出右界 
  else printf("%d",l);//若可行解为左界,输出左界 
  return 0;
}
/**************************************************************
	Problem: 1910
	User: admin
	Language: C++
	Result: Accepted
	Time:90 ms
	Memory:5984 kb
****************************************************************/