#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 < M; 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 (long long k = 0; k < used[j].size(); k++) { ans += abs(A[j] - B[used[j][k]]); } } return ans; } int main() { long logn M, N; cin >> M >> N; vectorA(M), B(N); input_arr(A, M); input_arr(B, N); sort(A.begin(), A.end()); sort(B.begin(), B.end()); assert(1 <= N && N <= 2000); assert(1 <= M && M <= N); for (long long i = 0; i < M; i++) { assert(1 <= A[i] && A[i] <= 1000000000); } for (long long i = 0; i < N; i++) { assert(1 <= B[i] && B[i] <= 1000000000); } vectorC(A.begin(), A.end()); vectorD(B.begin(), B.end()); C.insert(C.begin(), INF * (-1)); C.insert(C.end(), INF); D.insert(D.begin(), INF * (-1)); D.insert(D.end(), INF); for (long long i = 1; i <= M; i++) { cout << ans(D, C, i) % INF << endl; } }