#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
vector<long long> minp;
vector<long long> maxp;
int search(int a, int b, int q) {
int low = 0, high = q, mid, work = 0;
while (low <= high) {
mid = low + (high - low) / 2;
if (abs(minp[mid]) + abs(maxp[mid]) >= b - a) {
work = mid;
high = mid - 1;
} else {
low = mid + 1;
}
}
return work;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, q;
cin >> n >> q;
vector<int> arr(n + 1);
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
vector<int> wind(q);
minp.resize(q + 1, 0);
maxp.resize(q + 1, 0);
long long sum = 0;
for (int i = 1; i <= q; i++) {
cin >> wind[i - 1];
sum += wind[i - 1];
minp[i] = min((long long)minp[i - 1], sum);
maxp[i] = max((long long)maxp[i - 1], sum);
}
vector<long long> ans(n + 1, 0);
for (int i = 1; i < n; i++) {
int poz = search(arr[i], arr[i + 1], q);
ans[i] += maxp[poz];
ans[i + 1] += abs(minp[poz]);
if (poz != q && maxp[poz + 1] > maxp[poz]) {
ans[i] += (arr[i + 1] - arr[i]) - (abs(minp[poz]) + abs(maxp[poz]));
}
if (poz != q && minp[poz + 1] < minp[poz]) {
ans[i + 1] += (arr[i + 1] - arr[i]) - (abs(minp[poz]) + abs(maxp[poz]));
}
}
ans[1] += abs(minp[q]);
ans[n] += abs(maxp[q]);
for (int i = 1; i <= n; i++) {
cout << ans[i] << '\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |