#include<bits/stdc++.h>
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
typedef long long ll;
const int maxn = 200010;
ll cnt[maxn<<2], lazy[maxn<<2], sum[maxn<<2];
int l[maxn], pos, mx, ans;
void up(int rt){
    sum[rt] = sum[ls] + sum[rs];
}
void down(int rt, int ln, int rn){
    if(lazy[rt]){
        lazy[ls] += lazy[rt];
        lazy[rs] += lazy[rt];
        sum[ls] += (ll) ln * lazy[rt];
        sum[rs] += (ll) rn * lazy[rt];
        lazy[rt] = 0;
    }
}
void upd(int rt,int l,int r,int v,int L,int R){
    if(L<=l&&r<=R){
        sum[rt] += (ll)v*(r-l+1);
        lazy[rt] += v;
        return ;
    }
    int m = (l+r)>>1;
    down(rt,m-l+1,r-m);
    if(L<=m)upd(ls,l,m,v,L,R);
    if(R>m)upd(rs,m+1,r,v,L,R);
    up(rt);
}
ll query(int rt, int l, int r, int L, int R){
    if(L<=l&&r<=R){
        return sum[rt];
    }
    int m = (l+r)>>1;
    ll ans = 0;
    down(rt,m-l+1,r-m);
    if(L<=m)
        ans += query(ls,l,m,L,R);
    if(R>m)
        ans += query(rs,m+1,r,L,R);
    return ans;
}
int get(int rt, int l, int r, int k){
    if(l==r){
        return l;
    }
    int m = (l+r)>>1;
    down(rt,m-l+1,r-m);
    if(query(1,1,mx,1,m)>=k)
        return get(ls,l,m,k);
    else    
        return get(rs,m+1,r,k);
}
int main(){
    int n, k;
    scanf("%d%d", &n, &k);
    memset(cnt,0,sizeof(cnt));
    memset(lazy,0,sizeof(lazy));
    cnt[1]=1;
    for(int i = 0; i < n; ++i)scanf("%d", &l[i]);
    sort(l,l+n);
    reverse(l,l+n);
    pos = 1,mx = l[0]+500, ans = 1e9;
    upd(1,1,mx,1,pos+2,pos+1+(l[0]-1)/2);
    upd(1,1,mx,1,pos+2,pos+1+l[0]/2);
    int res = get(1,1,mx,k);
    if(query(1,1,mx,1,res)>=k)
        ans=min(ans,res);
    for(int i=1;i<n;i++){
        while(query(1,1,mx,pos,pos)==0)pos++;
        upd(1,1,mx,-1,pos,pos);
        upd(1,1,mx,1,pos+2,pos+1+(l[i]-1)/2);
        upd(1,1,mx,1,pos+2,pos+1+l[i]/2);
        res = get(1,1,mx,k);
        if(query(1,1,mx,1,res)>=k)
            ans=min(ans,res);
    }
    printf("%d\n",ans==1e9?-1:ans-1);
    return 0;
}