#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define int long long
signed main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    int n,m;
    while(cin >> n >> m && n!=0){
        vector<int> c(n);
        rep(i,n)cin >> c[i];
        int ok = 1000000; // 1~m-1 回以下でクリア
        int ng = 0;
        while(ok-ng>1){
            int mid = (ok+ng)/2;
            int L = 1;
            bool flag = 0;
            rep(j,m-1){
                auto x = lower_bound(c.begin(),c.end(),L+mid);
                if(x==c.end()){
                    flag = 1;
                    break;
                }else if(x==c.begin()){
                    break;
                }else{
                    x = lower_bound(c.begin(),c.end(),L);
                    int tmp = 100000000;
                    if((*x)<L+mid){
                        tmp = min(tmp,abs(L-(*x)));
                    }
                    if(x!=c.begin()){
                        x--;
                        tmp = min(tmp,abs(L-(*x)));
                    }
                    L += max(1LL,mid - tmp);
                }
            }
            if(flag){
                ok = mid;
            }else{
                ng = mid;
            }
        }
        // int ok2 = 1; // クリア出来る中でm-1回より多くかかる
        // int ng2 = 1000000;
        // while(ng2-ok2>1){
        //     int mid = (ok2+ng2)/2;
        //     int L = 1;
        //     bool flag = 0;
        //     rep(j,m-1){
        //         auto x = lower_bound(c.begin(),c.end(),L+mid);
        //         if(x==c.end()){
        //             flag = 1;
        //             break;
        //         }else if(x==c.begin()){
        //             break;
        //         }else{
                    
        //             x = lower_bound(c.begin(),c.end(),L);
        //             int tmp = 100000000;
        //             if((*x)<L+mid){
        //                 tmp = min(tmp,abs(L-(*x)));
        //             }
        //             if(x!=c.begin()){
        //                 x--;
        //                 tmp = min(tmp,abs(L-*x));
        //             }
        //             L += max(1LL,mid - tmp);
        //         }
        //     }
        //     if(flag){
        //         ng2 = mid;
        //     }else{
        //         ok2 = mid;
        //     }
        // }
        ok--;
        // cerr << ok << endl;
        int mid = ok;
        int L = 1;
        bool flag = 0;
        rep(j,m){
            auto x = lower_bound(c.begin(),c.end(),L+mid);
            if(x==c.end()){
                if(j<m-1)flag  =1;
                break;
            }else if(x==c.begin()){
                flag = 1;
                break;
            }else{
                
                x = lower_bound(c.begin(),c.end(),L);
                int tmp = 100000000;
                if((*x)<L+mid){
                    tmp = min(tmp,abs(L-(*x)));
                }
                if(x!=c.begin()){
                    x--;
                    tmp = min(tmp,abs(L-(*x)));
                }
                L += max(1LL,mid - tmp);
            }
        }
        if(flag){
            cout << -1 << "\n";
        }else{
            cout << ok << "\n";
        }
    }


    return 0;
}


Measured memory_bytes: 3864