Submission #1174506

#TimeUsernameProblemLanguageResultExecution timeMemory
1174506turnejaSjeckanje (COCI21_sjeckanje)C++20
110 / 110
841 ms67520 KiB
//https://dmoj.ca/problem/coci20c5p5
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;

#define endl "\n"
#define ll long long
#define IOS ios_base::sync_with_stdio(false); cin.tie(nullptr);

const int N = 2e5 + 5;
const long long INF = 4e18;

struct Node {
    long long val[3][3];
    long long lazy;
    Node() {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                val[i][j] = 0;
            }
        }
        lazy = 0;
    }
    Node(long long x) {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                val[i][j] = -INF;
            }
        }
        val[0][0] = 0;
        val[0][1] = -x;
        val[1][0] = -x;
        val[0][2] = x;
        val[2][0] = x;
        lazy = 0;
    }
};

Node segtree[4 * N];
long long a[N];

Node combine(Node left, Node right) {
    Node node = Node();

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            node.val[i][j] = max({left.val[i][0] + right.val[0][j], left.val[i][1] + right.val[2][j], left.val[i][2] + right.val[1][j], left.val[i][j], right.val[i][j]});
        }
    }
    return node;
}

void compose(int parent, int child) {
    segtree[child].lazy += segtree[parent].lazy;
}

void apply(int node, int l, int r) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (segtree[node].val[i][j] == -INF) {
                continue;
            }
            long long add = 0;
            if (i == 1) {
                add -= segtree[node].lazy;
            } else if (i == 2) {
                add += segtree[node].lazy;
            }
            if (j == 1) {
                add -= segtree[node].lazy;
            } else if (j == 2) {
                add += segtree[node].lazy;
            }
            segtree[node].val[i][j] += add;
        }
    }
    if (l != r) {
        compose(node, 2 * node + 1);
        compose(node, 2 * node + 2);
    }
    segtree[node].lazy = 0;
}

void incUpdate(int node, int l, int r, int lq, int rq, ll add) {
    if (l > rq || lq > r) {
        return;
    }
    if (l >= lq && r <= rq) {
        segtree[node].lazy += add;
        return;
    }
    apply(node, l, r);
    int mid = (l + r) / 2;
    incUpdate(node * 2 + 1, l, mid, lq, rq, add);
    incUpdate(node * 2 + 2, mid + 1, r, lq, rq, add);
    apply(2 * node + 1, l, mid);
    apply(2 * node + 2, mid + 1, r);
    segtree[node] = combine(segtree[2 * node + 1], segtree[2 * node + 2]);
}


void build(int l, int r, int node) {
    if (l > r) {
        return;
    }
    if (l == r) {
        segtree[node] = Node(a[l]);
        return;
    }

    int mid = (l + r) / 2;
    build(l, mid, 2 * node + 1);
    build(mid + 1, r, 2 * node + 2);
    segtree[node] = combine(segtree[2 * node + 1], segtree[2 * node + 2]);
}

int main() {
    IOS;
    int n, q;
    cin >> n >> q;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    build(0, n - 1, 0);
    for (int i = 0; i < q; i++) {
        int l, r, x;
        cin >> l >> r >> x;
        l--, r--;
        incUpdate(0, 0, n - 1, l, r, x);
        apply(0, 0, n - 1);
        cout << segtree[0].val[0][0] << endl;
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...