#include <bits/stdc++.h>
#define debug(x) cerr << #x << " = " << x << endl
using namespace std;
typedef long long LL;
constexpr int N = 200005;
int n, k, a[N];

struct node {
    int cap, sum, h, toph;
    bool operator < (const node &p) const {
        return h > p.h;
    }
};

priority_queue<node> S;

LL add(LL x, LL toph, LL sum) {
    LL h = min(toph + sum / 2, x);
    LL t = (h - toph + 1);
    LL num = 2 * t - 1;
    if(num > sum) num = sum;
    return num;
}

bool judge(LL x) {
    while(!S.empty()) S.pop();
    node now;
    now.sum = 1; now.cap = 1; now.h = 0; now.toph = 0;
    S.push(now);
    int white = 1, ans = -1;
    bool flag = false;
    for(int i = 1; i <= n; i++) {
        node last = S.top();
        now.sum = a[i]; now.cap = a[i] - 1; now.h = last.h + 2; now.toph = last.h + 1;
        if(now.sum <= 2 || now.h > x) break;
        if(now.cap > 0) S.push(now);
        S.pop();
        last.cap--;
        int t = ((last.sum - last.cap) & 1);
        last.h += t;
        if(last.cap > 0) S.push(last);
    }
    LL cnt = 0;
    while(!S.empty()) {
        node now = S.top();
        cnt += add(x, now.toph, now.sum) - add(x, now.toph, now.sum - now.cap);
        S.pop();
    }
    return cnt >= k;
}

int main()
{
    scanf("%d %d", &n, &k);
    for(int i = 1; i <= n; i++) scanf("%d", a + i);
    sort(a + 1, a + n + 1);
    reverse(a + 1, a + n + 1);
    bool flag = false;
    LL l = 1, r = 1000000000;
    while(l < r) {
        LL mid = (l + r) >> 1;
        if(judge(mid)) r = mid, flag = true;
        else l = mid + 1;
    }
    if(flag) printf("%lld\n", l);
    else puts("-1");
    return 0;
}
		 						 				   		 			  			 		