#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... |