#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define logn long #define lnog long #define lgon long #define itn int const long long INF = 1e15; template void input_arr(vector& A, long long N) { for (long long i = 0; i < N; i++) { cin >> A[i]; } } long long ans(const vector& A, const vector& B, long long i) { long long N = A.size(), M = B.size(); dequeused[N + 1]; long long closest = 0; for (long long j = 0; j < N; j++) { while (closest + 1 < N && !(abs(B[j] - A[closest] < abs(B[j] - A[closest + 1])))) { closest++; } if (used[closest].size() == i) { long long right = closest, left = closest; while (left != 0 && used[left - 1].size() == i) left--; while (right + 1 < N && used[right + 1].size() == i) right++; right++; used[right].push_back(j); long long change = 0; for (long long k = left; k <= right; k++) { change += abs(A[k - 1] - B[used[k][0]]) - abs(A[k] - B[used[k][0]]); } if (change < 0) { for (long long k = left; k = right; k++) { used[k - 1].push_back(used[k].front()); used[k].pop_front(); } } } else { used[closest].push_back(j); } } long long ans = 0; for (long long j = 0; j < N; j++) { for (auto k : used[j]) { ans += abs(A[j] - B[k]); } } return ans; } int main() { long logn M, N; cin >> M >> N; vectorA(M), B(N); input_arr(A, M); input_arr(B, N); B.push_back(-INF); B.push_back(INF); sort(A.begin(), A.end()); sort(B.begin(), B.end()); A.insert(A.begin(), INF * (-1)); A.insert(A.end(), INF); B.insert(B.begin(), INF * (-1)); B.insert(B.end(), INF); for (long long i = 1; i <= M; i++) { cout << ans(B, A, i) % INF << endl; } }