#include #define ls(k) k << 1 #define rs(k) k << 1 | 1 #define fi first #define se second #define open(s1, s2) freopen(s1, "r", stdin), freopen(s2, "w", stdout); using namespace std; typedef __int128 __; typedef long double lb; typedef double db; typedef unsigned long long ull; typedef long long ll; bool Begin; const int N = 1e5 + 10; inline ll read(){ ll x = 0, f = 1; char c = getchar(); while(c < '0' || c > '9'){ if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9'){ x = (x << 1) + (x << 3) + (c ^ 48); c = getchar(); } return x * f; } inline void write(ll x){ if(x < 0){ putchar('-'); x = -x; } if(x > 9) write(x / 10); putchar(x % 10 + '0'); } int n, k, l, r, ans; int a[N]; multiset S; inline bool check(int x){ S.clear(); int me = a[1] + a[x], sum = 0; for(int i = n; i >= 2; --i){ if(i == x) continue; S.insert(a[i]); } for(int i = n; i >= 2; --i){ if(!S.count(a[i]) || i == x) continue; int t = me - a[i] + 1; auto it = S.lower_bound(t); if(it != S.end() && ((*it) != a[i] || S.count(a[i]) > 1)){ ++sum; S.erase(it); S.erase(S.find(a[i])); } } return (sum < k); } bool End; int main(){ // open("prize.in", "prize.out"); n = read(), k = read(); for(int i = 1; i <= n; ++i) a[i] = read(); sort(a + 2, a + n + 1); l = 2, r = n; while(l <= r){ int mid = (l + r) >> 1; if(check(mid)){ ans = mid; r = mid - 1; } else l = mid + 1; } if(!ans){ puts("-1"); exit(0); } write(a[ans]); cerr << '\n' << abs(&Begin - &End) / 1048576 << "MB"; return 0; }