// O(n^2*x / w) time where w is machine word size #include using namespace std; typedef unsigned long long ull; const int BITS = 64; int SubsetSum(vector &X, int t) { int n = X.size(); ull Poss[t/BITS + 2] = {}; Poss[0] = 1; int tot = 0; for (int i = 0; i < n; tot += X[i], ++i) { int big_shift = X[i] / BITS, small_shift = X[i] % BITS; ull LO = small_shift ? (1ULL << (BITS - small_shift)) - 1 : ~0ULL; ull HI = ~0ULL ^ LO; for (int v = min(t-X[i], tot)/BITS; v >= 0; --v) { Poss[v+big_shift+1] |= (Poss[v] & HI) >> (BITS - small_shift); Poss[v+big_shift] |= (Poss[v] & LO) << small_shift; } } for (int v = t; v >= 0; --v) if (Poss[v/BITS] & (1ULL << (v % BITS))) return tot - v; } int main(void) { int n, x; scanf("%d%d", &n, &x); vector T(n); for (int &t: T) scanf("%d", &t); sort(T.begin(), T.end()); int max_T = T.back(); while (!T.empty() && T.back() > x) T.pop_back(); int ans; if (T.size() > 4) { vector Jobs; int tot = 0; for (int i = 4; i < T.size(); ++i) { Jobs.push_back(x+1-T[i]); tot += Jobs.back(); } ans = x+1 + SubsetSum(Jobs, tot/2); } else if (T.size() > 2) { ans = x+1; } else ans = max_T; printf("%d\n", max(max_T, ans)); }