#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;

#define ll long long

int read()
{
    int x = 0, f = 1;
    char c = getchar();
    while (c < '0' || c > '9')
    {
        if (c == '-')
            f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9')
        x = (x << 1) + (x << 3) + c - '0', c = getchar();
    return x * f;
}

struct Segment
{
    ll sum[N << 2], tag[N << 2];
    void addtag(int pos, int l, int r, ll w)
    {
        sum[pos] += 1ll * w * (r - l + 1);
        tag[pos] += w;
    }
    void pushup(int pos)
    {
        sum[pos] = sum[pos << 1] + sum[pos << 1 | 1];
    }
    void pushdown(int pos, int l, int r)
    {
        if (tag[pos])
        {
            ll &w = tag[pos];
            int mid = (l + r) >> 1;
            addtag(pos << 1, l, mid, w);
            addtag(pos << 1 | 1, mid + 1, r, w);
            w = 0;
        }
    }
    void update(int ql, int qr, int w, int pos, int l, int r)
    {
        if (ql <= l && r <= qr)
        {
            addtag(pos, l, r, w);
            return;
        }
        pushdown(pos, l, r);
        int mid = (l + r) >> 1;
        if (ql <= mid)
            update(ql, qr, w, pos << 1, l, mid);
        if (qr > mid)
            update(ql, qr, w, pos << 1 | 1, mid + 1, r);
        pushup(pos);
    }
    int Findmin(int pos, int l, int r)
    {
        if (l == r)
            return l;
        int mid = (l + r) >> 1;
        pushdown(pos, l, r);
        if (sum[pos << 1])
            return Findmin(pos << 1, l, mid);
        else
            return Findmin(pos << 1 | 1, mid + 1, r);
    }
    int Findkth(int pos, int l, int r, int k)
    {

        if (l == r)
            return l;
        int mid = (l + r) >> 1;
        pushdown(pos, l, r);
        // cout << l << " " << r << " " << sum[pos << 1] << endl;
        if (sum[pos << 1] >= k)
            return Findkth(pos << 1, l, mid, k);
        else
            return Findkth(pos << 1 | 1, mid + 1, r, k - sum[pos << 1]);
    }
} t;
int a[N];
int main()
{
    int n = read(), k = read();
    int Z = 2e5;
    ll sum = 1;

    for (int i = 1; i <= n; i++)
        a[i] = read();
    sort(1 + a, 1 + a + n, greater<int>());
    t.update(0, 0, 1, 1, 0, Z);
    ll ans = 1e18;

    for (int i = 1; i <= n; i++)
    {
        int x = a[i];
        sum += x - 2;

        int o = t.Findmin(1, 0, Z);
        t.update(o, o, -1, 1, 0, Z);

        if (x & 1)
        {
            t.update(min(Z, o + 2), min(Z, o + 1 + x / 2), 2, 1, 0, Z);
        }
        else
        {
            t.update(min(Z, o + 2), min(Z, o + 1 + x / 2), 1, 1, 0, Z);
            t.update(min(Z, o + 2), min(Z, o + x / 2), 1, 1, 0, Z);
        }

        if (sum >= k)
        {
            //cout << t.Findkth(1, 0, Z, k) << endl;
            ans = min(ans, 1ll * t.Findkth(1, 0, Z, k));
            
        }
    }
    if (ans == 1e18)
        cout << -1 << endl;
    else
        cout << ans << endl;
}