#include using namespace std; #define rep(i, n) for (int i = 0; i < (int)(n); i++) template enable_if_t, T> bin_search(T ok, T ng, function check) { while (max(ok, ng) - min(ok, ng) > 1) { T mid = midpoint(ok, ng); (check(mid) ? ok : ng) = mid; } return ok; } int main() { int N, M; cin >> N >> M; vector S(N); rep(i, N) { cin >> S[i]; } vector T(M); rep(i, M) { cin >> T[i]; } // n体を倒した場合の最大負担. // 倒せない場合はINT_MAX auto calc_max_loss = [&](int break_ghost_cnt) -> int { if (break_ghost_cnt == 0) { return 0; } if (M < break_ghost_cnt) { return INT32_MAX; } multiset sub_S(S.begin(), S.end()); vector sub_T(T.begin(), T.begin() + break_ghost_cnt); sort(sub_T.begin(), sub_T.end()); int score = 0; for (auto t : sub_T) { auto itr = sub_S.lower_bound(t); if (itr == sub_S.end()) { return INT32_MAX; } score = max(score, *itr - t); sub_S.erase(itr); } return score; }; // ghostをcnt体倒せるかどうか auto check_breakble = [&](int cnt) -> bool { return calc_max_loss(cnt) != INT32_MAX; }; int max_breakable_ghost_cnt = bin_search(0, M + 2, check_breakble); cout << calc_max_loss(max_breakable_ghost_cnt) << endl; return 0; }