This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define blue 0
#define red 1
#define purple 2
#define pb push_back
#define F first
#define S second
#define sz(x) (int)x.size()
#define el "\n"
using namespace std;
typedef long long ll;
const int N = 2e5 + 500;
ll a[N], f[N][2], b[N];
ll t[4 * N][2][2];
int n, q;
int sg(ll x) {
    if (x < 0) {
        return -1;
    }
    if (x > 0) {
        return 1;
    }
    return 0;
}
void comb(int v, int vl, int vr, int md) {
    t[v][0][0] = max({t[vl][0][0] + t[vr][0][0], t[vl][0][0] + t[vr][1][0], t[vl][0][1] + t[vr][0][0]});
    t[v][0][1] = max({t[vl][0][0] + t[vr][0][1], t[vl][0][0] + t[vr][1][1], t[vl][0][1] + t[vr][0][1]});
    t[v][1][0] = max({t[vl][1][0] + t[vr][0][0], t[vl][1][0] + t[vr][1][0], t[vl][1][1] + t[vr][0][0]});
    t[v][1][1] = max({t[vl][1][0] + t[vr][0][1], t[vl][1][0] + t[vr][1][1], t[vl][1][1] + t[vr][0][1]});
    if (sg(b[md]) == sg(b[md + 1])) {
        t[v][0][0] = max(t[v][0][0], t[vl][0][1] + t[vr][1][0]);
        t[v][0][1] = max(t[v][0][1], t[vl][0][1] + t[vr][1][1]);
        t[v][1][0] = max(t[v][1][0], t[vl][1][1] + t[vr][1][0]);
        t[v][1][1] = max(t[v][1][1], t[vl][1][1] + t[vr][1][1]);
    }
}
void build(int v, int l, int r) {
    if (l == r) {
        t[v][0][0] = 0;
        t[v][0][1] = -1e18;
        t[v][1][0] = -1e18;
        t[v][1][1] = abs(b[l]);
    } else {
        int md = (l + r) >> 1;
        build(v * 2, l, md);
        build(v * 2 + 1, md + 1, r);
        comb(v, v * 2, v * 2 + 1, md);
    }
}
void upd(int v, int l, int r, int ps, int val) {
    if (l == r) {
        b[l] += val;
        t[v][1][1] = abs(b[l]);
    } else {
        int md = (l + r) >> 1;
        if (ps <= md) {
            upd(v * 2, l, md, ps, val);
        } else {
            upd(v * 2 + 1, md + 1, r, ps, val);
        }
        comb(v, v * 2, v * 2 + 1, md);
    }
}
int main() {
    cin >> n >> q;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (int i = 1; i < n; i++) {
        b[i] = a[i + 1] - a[i];
    }
    build(1, 1, n - 1);
    while (q--) {
        int l, r, x;
        cin >> l >> r >> x;
        if (l - 1 >= 1) {
            upd(1, 1, n - 1, l - 1, +x);
        }
        if (r < n) {
            upd(1, 1, n - 1, r, -x);
        }
        cout << max({t[1][0][0], t[1][0][1], t[1][1][0], t[1][1][1]}) << el;
//        for (int i = 1; i <= n; i++) {
//            for (int j = 0; j < 2; j++) {
//                f[i][j] = -1e18;
//            }
//        }
//        f[1][0] = 0;
//        f[1][1] = abs(b[1]);
//        for (int i = 2; i < n; i++) {
//            if ((b[i - 1] < 0 && b[i] < 0) || (b[i - 1] > 0 && b[i] > 0)) {
//                f[i][1] = max(f[i][1], f[i - 1][1] + abs(b[i]));
//            }
//            f[i][1] = max(f[i - 1][0] + abs(b[i]), f[i][1]);
//            f[i][0] = max(f[i - 1][0], f[i - 1][1]);
//        }
//        cout << max(f[n - 1][0], f[n - 1][1]) << el;
    }
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |