/*
* Problem :: 2110 / 공유기 설치
*
* Kind :: Binary Search
*
* Insight
* - Greedy 하게 풀 수 있나?
* + X[0] 과 X[N-1] 에 공유기 설치하고
* 가운데 적절히 놓으면 되지 않을까?
* # 적절히 놓을 때 거리에 따라 놓는 기준이 있어야 되는데...
* 이 적절히를 알고리즘으로 구현하기가 너무 까다롭다
* (다루어야 할 상황이 너무 복잡하고 다양하다)
* -> 이럴바엔 인접한 거리를 사전에 정하고 X[0] 에 공유기 설치 후,
* 인접한 거리 이상으로 놓아보면서 가능한지 판별하자 => 이분 탐색이넹
*
* - 사전에 정한 인접거리가 클수록 공유기를 설치하는 개수는 적어지고
* 사전에 정한 인접거리가 작을수록 공유기를 설치하는 개수는 많아지니
* 단조감소함수이며 이분 탐색을 쓸 수가 있었구나~
*
* Point
* - 좌표가 [1, 10^9] 이다.
* + long 을 사용하도록 하자
*
* - 사전에 정한 인접거리에 따라 공유기를 설치했을 때,
* 공유기의 개수 C 보다 더 설치가능하다면
* 이는 결국 공유기를 주어진 조건에 부합하게 설치 가능하다는 것이다
* (즉, 이는 가장 인접한 공유기가 사전에 정한 인접거리 이상인채로
* 공유기 C개 이상을 설치가능하다는 뜻이다)
* + 위는, C개 까지 설치한 후 더이상 설치 안하는 것으로 간주할 수 있다
* # 무튼, 성공이다
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
#include <algorithm>
using namespace std;
#define endl '\n'
// Set up : Global Variables
/* None */
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int N, C;
cin >> N >> C;
long X[N];
for (int i=0; i<N; i++) {
cin >> X[i];
}
// Process
sort(X, X+N);
long l = 1;
long r = X[N-1];
long ans = -1;
while (l <= r) {
long m = (l + r) / 2; /* 사전에 가장 인접한 공유기의 인접거리를 정함 */
int cnt = 1;
long cpos = X[0]; /* 마지막으로 공유기가 설치된 위치 */
for (int i=1; i<N; i++) {
if (cpos+m <= X[i]) { /* X[i] 가 마지막으로 공유기가 설치된 위치로부터
* 사전에 정한 인접거리 이상만큼 떨어져 있을 때 */
cnt++; /* 공유기 설치 및 */
cpos = X[i]; /* 마지막으로 공유기가 설치된 위치 갱신 */
}
}
if (cnt >= C) { /* 성공 */
ans = m;
l = m+1; /* 인접거리를 늘려볼까? */
} else { /* 실패 */
r = m-1; /* 인접거리를 줄여야한다! */
}
}
// Control : Output
cout << ans << endl;
}
// Helper Functions
/* None */