Submission #1350952

#TimeUsernameProblemLanguageResultExecution timeMemory
1350952msab3fSjeckanje (COCI21_sjeckanje)C++20
110 / 110
505 ms41736 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAX_N = 200'000 + 10;
const long long INF = 1e16;

int n, q, arr[MAX_N];

struct Node {
    long long dp[2][2], st, en;

    Node(long long x = 0) : st(x), en(x) {
        dp[1][1] = abs(x);
        dp[0][0] = dp[0][1] = dp[1][0] = 0;
    }

    Node(const Node& lc, const Node& rc) {
        st = lc.st;
        en = rc.en;
        bool limited = (lc.en < 0 && rc.st > 0) || (lc.en > 0 && rc.st < 0);
        for (int i = 0; i < 2; ++i) {
            for (int j = 0; j < 2; ++j) {
                dp[i][j] = 0;
                for (int k = 0; k < 2; ++k) {
                    for (int l = 0; l < 2; ++l) {
                        if (k + l == 2 && limited) continue;
                        dp[i][j] = max(dp[i][j], lc.dp[i][k] + rc.dp[l][j]);
                    }
                }
            }
        }
    }
} tree[4 * MAX_N];

void build(int id = 1, int l = 1, int r = n) {
    if (r - l == 1) {
        tree[id] = arr[l + 1] - arr[l];
    } if (r - l > 1) {
        int mid = (l + r) >> 1;
        build(id << 1, l, mid);
        build(id << 1 | 1, mid, r);
        tree[id] = {tree[id << 1], tree[id << 1 | 1]};
    }
}

void modify(int i, long long x, int id = 1, int l = 1, int r = n) {
    if (r - l == 1) {
        tree[id] = tree[id].st + x;
    } else {
        int mid = (l + r) >> 1;
        if (i < mid) {
            modify(i, x, id << 1, l, mid);
        } else {
            modify(i, x, id << 1 | 1, mid, r);
        }
        tree[id] = {tree[id << 1], tree[id << 1 | 1]};
    }
}

long long get() {
    long long res = 0;
    for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 2; ++j) {
            res = max(res, tree[1].dp[i][j]);
        }
    }
    return res;
}

int main() {
    cin >> n >> q;

    for (int i = 1; i <= n; ++i) {
        cin >> arr[i];
    }

    build();

    while (q--) {
        int l, r, x;
        cin >> l >> r >> x;
        if (l > 1) modify(l - 1, x);
        if (r < n) modify(r, -x);
        cout << get() << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...