#include #include #include using namespace std; using lint = long long; vector gen(const vector &vec) { vector ret; ret.reserve(1 << vec.size()); auto rec = [&](auto &&self, int now, lint sum) -> void { if (now == (int)vec.size()) { ret.push_back(sum); return; } self(self, now + 1, sum); self(self, now + 1, sum + vec.at(now)); }; rec(rec, 0, 0); return ret; } int main() { int N, K; cin >> N >> K; vector A(N); for (auto &x : A) cin >> x; const int L = N / 2; auto left = gen(vector(A.begin(), A.begin() + L)); sort(left.rbegin(), left.rend()); auto right = gen(vector(A.begin() + L, A.end())); sort(right.begin(), right.end()); lint ok = -1e9 * 30, ng = 1e9 * 30 + 10; while (ng > ok + 1) { const lint c = (ok + ng) / 2; int cntr = 0; for (lint v : left) { cntr += right.cend() - lower_bound(right.cbegin(), right.cend(), c - v); if (cntr >= K) break; } (cntr >= K ? ok : ng) = c; } cout << ok << '\n'; }