#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
vector<long long> minp;
vector<long long> maxp;
int find_position(long long a, long long b, int q) {
int low = 1, high = q, mid, work = 0;
while (low <= high) {
mid = low + (high - low) / 2;
if (abs(minp[mid]) + abs(maxp[mid]) < b - a) {
work = mid;
low = mid + 1;
} else {
high = 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<long long> v(n + 1);
for (int i = 1; i <= n; i++) {
cin >> v[i];
}
minp.resize(q + 1, 0);
maxp.resize(q + 1, 0);
long long sum = 0;
for (int i = 1; i <= q; i++) {
long long x;
cin >> x;
sum += x;
minp[i] = min(minp[i - 1], sum);
maxp[i] = max(maxp[i - 1], sum);
}
vector<long long> ans(n + 1, 0);
for (int i = 1; i < n; i++) {
int poz = find_position(v[i], v[i + 1], q);
ans[i] += maxp[poz];
ans[i + 1] += abs(minp[poz]);
if (poz != q && maxp[poz + 1] > maxp[poz]) {
ans[i] += (v[i + 1] - v[i]) - (abs(minp[poz]) + abs(maxp[poz]));
}
if (poz != q && minp[poz + 1] < minp[poz]) {
ans[i + 1] += (v[i + 1] - v[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... |