#include<bits/stdc++.h>
using namespace std;
//type
typedef long long ll;
#define pii pair<int, int>;
#define vi vector<int>;
//x * y * 1.0 can cause overflow
//constant
#define inf (int)(1e9+7)
#define mod (ll)(1e9+7)
#define eps 1e-10
//omission
#define eb emplace_back
#define F first
#define S second
#define SZ(x) ((int)(x).size())
#define all(v) v.begin(), v.end()
//manip
#define chmax(a, b) a = max(a, b)
#define chmin(a, b) a = min(a, b)
#define UNIQUE(v) v.erase(unique(v.begin(), v.end(), v.end());
#define ceil(a, b) a / b + !!(a % b)
template<class T> T power(T a, T b)
{return b ? power(a * a % inf, b / 2) * (b % 2 ? a : 1) % inf : 1;}
#define LB(v, x) (int)(lower_bound(v.begin(), v.end(), x) - v.begin())
#define UB(v, x) (int)(upper_bound(v.begin(), v.end(), x) - v.begin())
//loop
#define rep(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
#define rep3(i, st, n) for (int i = st; i < n; ++i)
//algorithm
//double pointer, l start, how many adds, can be 0 -> init r = l, sum = 0
//bfs, not x, y, i, j
//not !(i % 2), i % 2 == 0


bool judge_close(vector<int> s, int n, int m) {
    int L = 1;
    int x = s[0];
    int cnt = 0;
    while (1) { //battles
        
        int it = LB(s, L);
        int taosu = -inf;
        
        if (s[n - 1] < L + x) {
            cnt++; //これ!!
            break;
        }
        
        if (s[it] < L + x) taosu = s[it];
        if (it >= 1 && abs(L - s[it]) > abs(L - s[it - 1])) taosu = s[it - 1];
        if (it < n - 1 && abs(L - s[it]) > abs(L - s[it + 1]) && s[it + 1] < L + x) taosu = s[it + 1];
        cnt++;
        if (cnt == m) break;
        
        if (taosu == s[n - 1]) {
            break;
        }
        L += max(1, x - abs(L - taosu));
        
    }
    if (cnt < m) {
        return 0;
    }
    return 1;
}

int main() {
    //cast caution
    //look constraints always
    cin.tie(0); ios::sync_with_stdio(false);
    
    
    
    
    
    int n, m;
    while (cin >> n && n) {
        cin >> m;
        vector<int> s(n);
        rep(i, n) cin >> s[i];
        
        
        
        int l = s[0]; //一番弱い敵倒す最低条件
        //これでM回未満でいけたら-1
        //X上げたらより少ない回数でいける
        if (judge_close(s, n, m) == 0) {
            cout << -1 << endl;
            continue;
        }
        
        
        
        int r = s[n - 1]; //1回で一番強い敵倒す最低条件 //M ≥ 2
        while (1) { //x
            
            int x = (l + r) / 2;
            int L = 1;
            int cnt = 0;
            while (1) { //battles
                
                int it = LB(s, L);
                int taosu = -inf;
                //どれも倒せないことはないでしょう
                
                //基本自分に一番近いの倒す
                //しかし、まずは一番強いの倒せるか判定
                if (s[n - 1] < L + x) {
                    cnt++; //これ!!
                    break;
                }
                
                if (s[it] < L + x) taosu = s[it];
                if (it >= 1 && abs(L - taosu) > abs(L - s[it - 1])) taosu = s[it - 1];
                if (it < n - 1 && abs(L - taosu) > abs(L - s[it + 1]) && s[it + 1] < L + x) taosu = s[it + 1];
                //if (x == 3) cout << taosu << endl;
                cnt++;
                if (cnt == m) break;
                
                
                L += max(1, x - abs(L - taosu));
                
            }
            if (cnt < m) { //すぐ倒せちゃう -> 厳しく
                r = x;
            } else {
                l = x;
            }
            //cout << l << " " << r << endl;
            
            if (l + 1 >= r) break;
        }
        
        cout << l << endl;
        
        
        
        
    }
    
    
    
    
    
}

/*
 なんかニブタンぽいなってなる
 
 
 
 
 
 Xの範囲決めよ
 X正
 X ≥ 1
 
 
 
 1. Xの上限
 X = (一番強い敵)
 このとき、初っ端から1 + X未満、つまりX以下倒せるから
 M ≥ 2より、このXを上限にニブタン
 
 
 
 2. X = 1
 敵の強さ1いなかったらng
 ng(X = 1) ok ng(Xmax)
 
 一番弱い敵のsiが下限か
 
 
 1いたら強くなり続けられるからいつかは倒せる
 X = 1でM回未満で倒せたら-1
 M回以上で倒せたらX = 1を下限にニブタン
 
 
 
 
 
 
 
 戦闘最低M回を答える
 できるだけ毎回強くなるようにしないといけない
 
 X - |L - si|
 強くなために引くのを少なくしたい
 自分に近いのを倒す
 
 
 
 Xに関してニブタンする log(smax) ≈ 6 / 0.3 ≈ 20
 自分に近いのを倒し続ける M = 10^6
 
 
 
 */

/*
 
 350 //5838 19729
 
 ...
 -1 //84502 1000000
 -1 //56823 1000000
 -1
 3
 6
 
 
 */



Measured memory_bytes: 3744