/*整体的思路是利用分治,如果组成X套牌可以,那么组成X - 1套牌也可以,那么就可以用二分查找法试探出使得组牌可以的最大套数值,现在最重要的就是实现一个check函数,检查配出x套牌可不可以

两个配牌方法实际可以看成是一种方法,即为要配一套牌必须要用到n种牌,但是缺了一种可以由joker牌来替代,不过不能存在需要同时抽两个或以上joker来配一套牌的状态,现在统计配x套牌需要多少张joker来补,一共需要max{0,x - c[i]}求和张joker来替补,记为S,则有S<=m,但是用什么条件来防止需要同时填补多张joker呢?只需保证S<=x即可,这个仔细思考可以得出S<=X &&S<= m时候即可满足能配x套牌
*/

#include <stdio.h>
#include <stdlib.h>


//实现判断能否组成x套牌的函数,这里考虑到s过大,应该用long long型数据
int check(long long *c, long long n, long long m, long long x){
     long long s = 0;//s记录需要用来代替的joker数
     for(long long i = 0; i < n; i ++){
        long long tmp = x - c[i];
        long long s_i = 0 > tmp ? 0 : tmp;
        s += s_i;
     }
     if(s <= m && s <= x){
        return 1;
     }
     else{
        return 0;
     }
}

int main() {
    //读取数据
    long long n, m;
    scanf("%lld %lld\n", &n, &m);
    long long *c = (long long *)malloc(sizeof(long long) * n);
    if(c == NULL){
        printf("Failed Malloc!\n");
        return -1;
    }
    for(long long i = 0; i < n; i ++){
        scanf("%lld", c + i);
    }
    //二分查找
    long long l = 0;
    //右端点h选一个绝对不会达到的大数,记住,一定要取得够大,覆盖的了边界条件
    long long h = 9000000000000;
    long long res = -1;
    while(l <= h){
        long long mid = l + (h - l) / 2;
        if(check(c, n, m, mid)){
            res = mid;
            l = mid + 1;
        }
        else{
            h = mid - 1;
        }
    }
    printf("%lld\n",res);
    free(c);
    return 0;
}