// IO library #include #include #include #include // algorithm library #include #include #include #include // contancer library #include #include #include #include #include #include #include #include #include #include using ll = long long; using ld = long double; /* ----- Output Functions for Debugging ----- */ template std::ostream& operator<<(std::ostream& os, std::vector v); template std::ostream& operator<<(std::ostream& os, std::set v); template std::ostream& operator<<(std::ostream& os, std::pair p); template std::ostream& operator<<(std::ostream& os, std::map v); template std::ostream& operator<<(std::ostream& os, std::queue q); template std::ostream& operator<<(std::ostream& os, std::priority_queue q); template std::ostream& operator<<(std::ostream& os, std::vector v) { os << "["; for (auto vv : v) os << vv << ","; return os << "]"; } template std::ostream& operator<<(std::ostream& os, std::set v) { os << "{"; for (auto vv : v) os << vv << ","; return os << "}"; } template std::ostream& operator<<(std::ostream& os, std::pair p) { return os << "(" << p.first << "," << p.second << ")"; } template std::ostream& operator<<(std::ostream& os, std::map v) { os << "{"; for (auto vv : v) os << vv << ","; return os << "}"; } template std::ostream& operator<<(std::ostream& os, std::queue q) { os << "["; while (!q.empty()) { os << q.front() << ","; q.pop(); } return os << "]"; } template std::ostream& operator<<(std::ostream& os, std::priority_queue q) { os << "{"; while (!q.empty()) { os << q.top() << ","; q.pop(); } return os << "}"; } /* ----- Short Functions ----- */ template T Vec(T v) { return v; } template auto Vec(size_t l, Ts... ts) { return std::vector(ts...))>(l, Vec(ts...)); } template inline T sq(T a) { return a * a; } template inline T iceil(T n, T d) { return (n + d - 1) / d; } template T gcd(T a, T b) { while (b > 0) { a %= b; swap(a, b); } return a; } template T ipow(T b, U n) { T ret = 1; while (n > 0) { if (n & 1) ret *= b; n >>= 1; b *= b; } return ret; } // 0-indexed template inline T kthbit(T a, U k) { return (a >> k) & 1; } template inline T mask(T a, U k) { return a & ((1 << k) - 1); } /* ----- class ----- */ template struct Edge { int from, to; T cost; Edge(int from = -1, int to = -1, T cost = 1) : from(from), to(to), cost(cost){}; bool operator<(const Edge& e) const { return this->cost < e.cost; } bool operator>(const Edge& e) const { return this->cost > e.cost; } }; template class Graph { public: explicit Graph(int N = 0) : size(N) { path.resize(size); } void span(int u, int v, T cost = 1) { path[u].push_back(Edge(u, v, cost)); } std::vector> operator[](int v) const { return path[v]; } int size; std::vector>> path; }; /* ----- Constants ----- */ // const int INF = 1 << 25; // const ll INF = 1LL << 50; // const ld PI = acos(-1); // const ld EPS = 1e-10; // mt19937 mt(ll(time(0))); int main() { int N; ll L; std::cin >> N >> L; std::vector> pos(N * 2); for (int i = 0; i < N; ++i) { std::cin >> pos[i].first; pos[i].second = 1; } for (int i = 0; i < N; ++i) { std::cin >> pos[i + N].first; pos[i + N].second = -1; } std::sort(pos.begin(), pos.end()); pos.push_back(pos.front()); if (pos[0].second < 0) std::terminate(); std::vector sushi(N * 2 + 1); sushi[0] = 0; for (int i = 0; i < N * 2; ++i) { sushi[i + 1] = sushi[i] + pos[i].second; } ll min = *std::min_element(sushi.begin(), sushi.end()); for (auto& s : sushi) s -= min; std::cerr << sushi << std::endl; ll ans = 0; for (int i = 1; i <= N * 2; ++i) { if (pos[i].second < 0) { ans = std::max(ans, pos[i].first + L * (sushi[i] - 1)); } } std::cout << ans << std::endl; return 0; }