#include <bits/stdc++.h>

using namespace std;

struct segment_tree{
    vector<long long> st, plusz;
    int maxn;

    void init(int n){
        maxn = n;
        st.resize(4*maxn, 0);
        plusz.resize(4*maxn, 0);
        return;
    }

    void pont_update(int x, int l, int r){
        st[x] = 0;
        if(l+1 != r)
            st[x] = st[2*x+1] + st[2*x+2];
        st[x] += (long long)(r-l)*plusz[x];
        return;
    }

    void upd(int s, int e, long long c, int x, int l, int r){
        if(r <= s || e <= l)
            return;
        if(s <= l && r <= e){
            plusz[x] += c;
            pont_update(x, l, r);
            return;
        }
        int m = (l+r)/2;
        upd(s, e, c, 2*x+1, l, m);
        upd(s, e, c, 2*x+2, m, r);
        pont_update(x, l, r);
        return;
    }

    void update(int l, int r, long long c){
        upd(l, r, c, 0, 0, maxn);
        return;
    }

    int querry(long long c, long long p, int x, int l, int r){
        if(l+1 == r)
            return l;
        p += plusz[x];
        int m = (l+r)/2;
        if(c <= st[2*x+1] + (m-l)*p)
            return querry(c, p, 2*x+1, l, m);
        c -= st[2*x+1] + (m-l)*p;
        return querry(c, p, 2*x+2, m, r);
    }

    int keres(long long c){
        return querry(c, 0, 0, 0, maxn);
    }

    long long ossz(){
        return st[0];
    }
};

int main()
{
    cin.sync_with_stdio(false);
    cin.tie(0);

    int n, k;
    cin>>n>>k;

    vector<int> v(n);
    for(int &x : v)
        cin>>x;

    segment_tree st;
    st.init((int)5e5);
    st.update(0, 1, 1);

    sort(v.rbegin(), v.rend());

    int meg = (int)1e9;
    int akt = 1;
    for(int x : v){
        int ind = st.keres(1);
        st.update(ind+2, ind+(x-1)/2+2, 1);
        st.update(ind+2, ind+x/2+2, 1);
        st.update(ind, ind+1, -1);

        if(st.ossz() >= k)
            meg = min(meg, st.keres(k));
    }

    if(meg < (int)1e9)
        cout<<meg<<"\n";
    else
        cout<<"-1\n";

    return 0;
}
