// O(m*log(m)*n*x / w) time where m is the number of distinct values #include using namespace std; typedef unsigned long long ull; const int BITS = 64; vector Reduce(vector &X) { while (true) { map freq; for (auto &x: X) ++freq[x]; vector Y; for (auto &e: freq) { int x = e.first, cnt = e.second, c = 1; while (2*c-1 <= cnt) { Y.push_back(x*c); c *= 2; } if (cnt > c-1) Y.push_back(x*(cnt-(c-1))); } if (Y == X) return Y; X = Y; } } int SubsetSum(vector &X, int t) { X = Reduce(X); int n = X.size(); fprintf(stderr, "reduce to %d items\n", n); 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)); }