Submission #1345982

#TimeUsernameProblemLanguageResultExecution timeMemory
1345982primovocatusSjeckanje (COCI21_sjeckanje)C++20
0 / 110
0 ms344 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5;

int a[N], b[N];

int sg(int x) {
    return (x == 0 ? 0 : x < 0 ? -1 : 1);
}

struct {
    struct node {
        int vl, vr, dp[2][2];

        void set(int x) {
            vl = vr = x;
            for (int i = 0; i < 2; ++i) {
                for (int j = 0; j < 2; ++j) {
                    dp[i][j] = 0;
                }
            }
            dp[1][1] = abs(x);
        }

        void merge(node& l, node& r) {
            vl = l.vl, vr = r.vr;
            
            for (int i = 0; i < 2; ++i) {
                for (int j = 0; j < 2; ++j) {
                    dp[i][j] = 0;
                }
            }

            for (int a = 0; a < 2; ++a) {
                for (int b = 0; b < 2; ++b) {
                    for (int c = 0; c < 2; ++c) {
                        for (int d = 0; d < 2; ++d) {
                            if (b && c) {
                                if (sg(l.vr) != sg(r.vl)) continue;
                                dp[a][d] = max(dp[a][d], l.dp[a][b] + r.dp[c][d]);
                            } else {
                                dp[a][d] = max(dp[a][d], l.dp[a][b] + r.dp[c][d]);
                            }
                        }
                    }
                }
            }
        }
    };

    node t[4 * N];

    void build(int v, int tl, int tr) {
        if (tl == tr) {
            t[v].set(b[tl]);
            return;
        }

        int tm = (tl + tr) >> 1;

        build(v << 1, tl, tm);
        build(v << 1 | 1, tm + 1, tr);

        t[v].merge(t[v << 1], t[v << 1 | 1]);
    }
    void update(int v, int tl, int tr, int l, int x) {
        if (tl == tr) {
            t[v].set(x);
            return;
        }

        int tm = (tl + tr) >> 1;

        if (l <= tm) {
            update(v << 1, tl, tm, l, x);
        } else {
            update(v << 1 | 1, tm + 1, tr, l, x);
        }

        t[v].merge(t[v << 1], t[v << 1 | 1]);
    }
    int get() {
        return t[1].dp[1][1];
    }
} T;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr);
    
    int n, q;
    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];
    }

    T.build(1, 1, n - 1);
    for (int i = 0; i < q; ++i) {
        int l, r, x;
        cin >> l >> r >> x;

        if (l - 1 >= 1) {
            b[l - 1] += x;
            T.update(1, 1, n - 1, l - 1, b[l - 1]);
        }
        
        if(r <= n - 1) {
            b[r] -= x;
            T.update(1, 1, n - 1, r, b[r]);
        }
        
        cout << T.get() << "\n";
    }
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...