import java.util.Arrays;
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class Main {
static long L;
static long n;
static long m;
static long a[];
public static boolean pd(long mid)
{
long count=0;
long i=0;
long now=0;
while(i<n+1)
{
i++;
if(a[(int) i]-a[(int) now]<mid)
{
count++;
}
else
{
now=i;
}
}
if(count>m)
{
return false;
}
else {
return true;
}
}
public static void main(String[] args) throws Exception {
Read in=new Read();
L=in.nextLong();
n=in.nextLong();
m=in.nextLong();
long mid=0;
a=new long[(int)n+2];
a[0]=0;
a[(int) (n+1)]=L;
for(int i=1;i<n+1;i++)
{
a[i]=in.nextLong();
}
long l=0;
long r=L;
while(l<r)
{
mid=(l+r)/2;
if(pd(mid))
{
l=mid+1;
}
else {
r=mid;
}
}
System.out.print(l-1);
}
}
class Read{
StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public long nextLong() throws Exception{
st.nextToken();
return (long)st.nval;
}
}