#include using i32 = std::int32_t; using u32 = std::uint32_t; using i64 = std::int64_t; using u64 = std::uint64_t; using i128 = __int128_t; using u128 = __uint128_t; using isize = std::ptrdiff_t; using usize = std::size_t; class rep { struct Iter { usize itr; constexpr Iter(const usize pos) noexcept: itr(pos) { } constexpr void operator ++ () noexcept { ++itr; } constexpr bool operator != (const Iter& other) const noexcept { return itr != other.itr; } constexpr usize operator * () const noexcept { return itr; } }; const Iter first, last; public: explicit constexpr rep(const usize first, const usize last) noexcept: first(first), last(std::max(first, last)) { } constexpr Iter begin() const noexcept { return first; } constexpr Iter end() const noexcept { return last; } }; template constexpr T INFTY = std::numeric_limits::max() / Div; template bool setmax(T& lhs, const T& rhs) { if (lhs < rhs) { lhs = rhs; return true; } return false; } template bool setmin(T& lhs, const T& rhs) { if (lhs > rhs) { lhs = rhs; return true; } return false; } template using Vec = std::vector; void H_main() { usize K; u64 N; std::cin >> K >> N; Vec A(K), B(K); for (auto& x: A) { std::cin >> x; } for (auto& x: B) { std::cin >> x; } if (N < K) { std::cout << A[N] << '\n'; return; } N -= K; A.resize(2 * K, -INFTY); for (auto i: rep(0, K)) { for (auto j: rep(0, K)) { setmax(A[i + K], std::min(A[i + j], B[j])); } } A.erase(A.begin(), A.begin() + K); const auto check = [&](const i64 threshold) { Vec T; T.reserve(K); for (auto i: rep(0, K)) { if (B[i] >= threshold) { T.push_back(K - i); } } if (T.empty()) { return false; } const auto V = T.back(); Vec dist(V, INFTY); Vec>> graph(V); for (auto i: rep(0, V)) { for (const auto t: T) { graph[i].emplace_back((i + t) % V, t); } } Vec done(V); setmin(dist[0], 0); while (true) { usize u = V; for (auto i: rep(0, V)) { if (!done[i] && (u == V || dist[u] > dist[i])) { u = i; } } if (u == V) { break; } done[u] = true; for (const auto [v, c]: graph[u]) { setmin(dist[v], dist[u] + c); } } for (auto i: rep(0, K)) { if (i <= N && A[i] >= threshold) { const auto make = N - i; if (dist[make % V] <= make) { return true; } } } return false; }; Vec cand(2 * K); for (auto i: rep(0, K)) { cand[i] = A[i]; cand[i + K] = B[i]; } std::sort(cand.begin(), cand.end()); usize ok = 0, ng = cand.size(); while (ng - ok > 1) { const auto md = (ok + ng) / 2; (check(cand[md]) ? ok : ng) = md; } std::cout << cand[ok] << '\n'; return; } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); H_main(); return 0; }