#include<cstdio>
#include<cstdlib>
#define maxN 50005
int L,N,M;
int distance[maxN];
int str2num(char* s) //读优化
{
int m = 0;
while(*s)
{
m *= 10;
m += *s-'0';
s++;
}
return m;
}
int diffStoneNum(int minDistance)
{
int i;
int num = 0;
int tmpDistance = 0;
for(i = 0;i <= N;i++) //贪心法计算最短距离不小于minDistance需要去掉的最少石头数
{
tmpDistance += distance[i];
if(tmpDistance < minDistance)
{
num++;
}
else
tmpDistance = 0;
}
return num;
}
int cmp(const void* a,const void* b)
{
return *((int*)a)-*((int*)b);
}
int main()
{
int i;
char strIn[12];
int left,mid,right;
while(~scanf("%d%d%d",&L,&N,&M))
{
left = 2000000000;
getchar();
distance[0] = 0;
right = distance[N+1] = L;
for(i = 1;i <= N;i++)
{
gets(strIn);
distance[i] = str2num(strIn);
}
qsort(distance+1,N,sizeof(int),cmp);
for(i = 1;i <= N+1;i++)
{
distance[i-1] = distance[i]-distance[i-1];
if(left > distance[i-1])
left = distance[i-1];
}
while(left < right)
{
mid = (left+right)/2+1; //防止死循环,除数向上取整
if(diffStoneNum(mid) > M) //若计算得到去掉石头数大于M,说明最短距离比mid小
right = mid-1;
else
left = mid; //最短距离可能等于mid,也可能比mid大
}
printf("%d\n",left);
}
return 0;
}