#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; vector A; vector build_values(int from, int to) { vector values; values.push_back(0); for (int i = from; i <= to; ++i) { vector temp = values; for (ll v : values) { ll nv = v + A[i]; temp.push_back(nv); } values = temp; } sort(values.begin(), values.end()); return values; } int main() { ll N, K; cin >> N >> K; A.resize(N); for (int i = 0; i < N; ++i) { cin >> A[i]; } if (N == 1) { if (K == 1) { cout << 0 << endl; } else { cout << A[0] << endl; } } else { int mid = N / 2; vector memo1 = build_values(0, mid - 1); vector memo2 = build_values(mid, N - 1); /* for (ll v1 : memo1) { cerr << v1 << " "; } cerr << endl; for (ll v2 : memo2) { cerr << v2 << " "; } cerr << endl; */ ll ok = LLONG_MAX - 1; ll ng = LLONG_MIN; while (abs(ok - ng) >= 2) { ll x = (ok + ng) / 2; ll cnt = 0; for (ll v1 : memo1) { if (v1 + memo2.back() < x) continue; ll ok2 = memo2.size() - 1; ll ng2 = -1; while (abs(ok2 - ng2) >= 2) { ll idx = (ok2 + ng2) / 2; ll nv = v1 + memo2[idx]; if (nv >= x) { ok2 = idx; } else { ng2 = idx; } } cnt += memo2.size() - ok2; } // fprintf(stderr, "x: %lld, cnt: %lld\n", x, cnt); if (cnt >= K) { ok = x; } else { ng = x; } } cout << ok << endl; } return 0; }