#include <bits/stdc++.h>
#ifndef ONLINE_JUDGE
#define debug(x) cout << #x << ": " << (x) << endl
#else
#define debug(x)
#endif
using namespace std;
typedef long long ll;
const int maxn=1e6+7,inf=0x3f3f3f3f,mod=1e9+7;

int l[maxn],n;
int k;

struct node
{
    int dis,len;
    bool operator < (const node &rhs) const
    {
        return dis>rhs.dis;
    }
};

bool check(int val)
{
    ll curw=1;
    priority_queue<node>pq;
    pq.push({0,1});
    for(int i=1;i<=n;++i)
    {
        auto tp=pq.top();
        int dep=tp.dis,cnt=tp.len;
        pq.pop();
        if(dep<=val) curw--;
        cnt--;
        if(cnt) pq.push({dep+1,cnt});
        pq.push({dep+2,l[i]/2});
        curw+=max(0,min(val,l[i]/2+dep+1)-dep-1);
        pq.push({dep+2,l[i]-1-l[i]/2});
        curw+=max(0,min(val,l[i]-l[i]/2+dep)-dep-1);
        if(curw>=k) return 1;
    }
    return 0;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>k;
    for(int i=1;i<=n;++i) cin>>l[i];
    sort(l+1,l+1+n,greater<int>());
    int l=1,r=1e9,ans=-1;
    while(l<=r)
    {
        ll mid=l+r>>1;
        if(check(mid)) r=(ans=mid)-1;
        else l=mid+1;
    }
    cout<<ans<<'\n';
    return 0;
}
