Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

ゲームバランス

あなたは冒険ゲームを作成している．このゲームのプレイヤーは，主人公を操作して敵モンスターを倒し，主人公のレベルを上げることで冒険を進めていく．主人公の初期レベルは 1 である．

このゲームには N 種類の敵モンスターが用意されており，弱い順で i 番目の種類の敵モンスターの強さは si である．主人公が 1 回の戦闘を行うときには，次に戦う敵モンスターの種類を自由に選び，ちょうど 1 体の敵モンスターと戦闘を行う．主人公は同じ種類の敵モンスターと何回でも戦うことができ，何回でも倒すことができる．

あなたはいま，このゲームのバランスを調整するために，あるパラメーター X を決めようとしている．パラメーター X は正の整数であり下記のように使われる．

主人公のレベルが L のとき，強さ si が L+X 未満の敵は倒せるが，それより強い敵モンスターは倒せない．

主人公のレベルが L のとき，強さ si の敵を倒すと max(1, X-|L-si|) だけ主人公のレベルが上がる．

このゲームは，最も強い（N 種類目の）敵モンスターを初めて倒したときにゲームクリアとなる．あなたは，ゲームクリアまでに必要となる戦闘の回数が最低でも M 回以上となるようにパラメーター X を決めたいと考えている．ただし，敵モンスターの強さの設定によっては，X をどのように設定しても M 回未満の戦闘回数でゲームクリアできてしまうか，ゲームをクリアできなくなってしまう場合があることに注意せよ．

パラメーター X を決めるとき，上記の条件を満たす範囲で最大のパラメーター値 Xmax を計算するプログラムを作ってほしい．

Input

入力は複数のデータセットから構成される．データセットの個数は最大でも 50 を超えない．各データセットは次の形式で表される．

N M
s1 s2 ... sN

1 行目は空白で区切られた 2 つの整数 N, M からなる．N は用意した敵モンスターの種類の数，M はゲームクリアまでに必要となるべき最小の戦闘の数であり，1 ≤ N ≤ 100,000, 2 ≤ M ≤1,000,000 を満たす．

2 行目は空白で区切られた N 個の整数 s1, s2, ..., sN からなり，N 種類の敵モンスターそれぞれの強さを表す．各 si は 1 ≤ si ≤ 1,000,000 を満たし，また si < si+1 (1 ≤ i ≤ N-1) である．

入力の終わりは空白で区切られた 2 つのゼロからなる行で表される．

Output

各データセットについて，ゲームクリアまでに必要となる戦闘の回数が M 回以上となるパラメーター X の内の最大値 Xmax を整数で出力せよ．X をどのように設定しても M 回未満の戦闘回数でゲームクリアできてしまうかゲームをクリアできなくなってしまうテストケースの場合には -1 のみからなる行を出力せよ．

Sample Input

3 4
1 5 9
1 2
1
2 10
1 1000000
2 4
1 10
0 0

Output for Sample Input

3
-1
499996
4

2 番目のテストケースでは，X = 1 と設定すると 1 回の戦闘でゲームをクリアできてしまう．
このケースでは，必要となる戦闘の回数が M 回以上であり，かつゲームをクリアできるように X を設定することが出来ない．
よって -1 のみからなる行を出力する．

Solution in C (judge verdict: Accepted)

#include<stdio.h>
#include<stdlib.h>
#define max(x,y) (x<y)?(y):(x)
#define INF 1000000
int N,M;
int s[INF];
int check(int X){
    int res=0;
    int L=1;
    int p=0;
    int index=0;
    if(L+X<=s[0]) return INF;
    while(L+X <= s[N-1]){
        //倒す敵を決定 L+X>s[i]かつmin(abs(L-s[i])
        int diff=INF;
        for(int i=p;i<N;i++){
            if(L+X>s[i]&&diff>abs(L-s[i])){
                diff=abs(L-s[i]);
                index=i;
            }
            else if(L+X<=s[i]) break;
        }p=index;
        L+=max(1,X-diff);
        res++;
    }
    return res+1;
}
int solve(){
    int left=s[0];
    int right=s[N-1];
    int mid;
    while(right-left>1){
        mid=(left+right)/2;
        int tmp=check(mid);
        if(tmp>=M){
            left=mid;
        }
        else{
            right=mid;
        }
    }
    if(check(left)>=M) return left;
    else return -1;
}
int main(void){
    while(1){
        scanf("%d%d",&N,&M);
        if(N+M==0) break;
        for(int i=0;i<N;i++) scanf("%d",&s[i]);
        printf("%d\n",solve());
    }
}