rt,
#include<iostream>
using namespace std;
int l, n, m;
int dis[50050];
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
x = x * 10 + ch - '0', ch = getchar();
return x * f;
}
int main() {
l = read(), n = read(), m = read();
for (int i = 1; i <= n; i++)
dis[i] = read();
int L = 0, R = l + 1, mid;
while (L + 1 < R) {
mid = L + R >> 1;
int shitou = 0, juli = dis[0];
for (int i = 1; i <= n + 1; i++)
if (dis[i] - juli < mid)//距离小于期望答案
shitou++;//移走
else
juli = dis[i];//下一个石头
if (shitou <= m)L = mid; //要移的数量小于等于题目要求,说明答案还可以更大
else R = mid; //答案过大
}
cout << L;
return 0;
}