Submission #1152378

#TimeUsernameProblemLanguageResultExecution timeMemory
1152378hmm789Sjeckanje (COCI21_sjeckanje)C++20
110 / 110
378 ms37808 KiB
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define double long double
#define INF 1000000000000000000
#define MOD 1000000007

int a[200001];
int sgn(int x) {
    return x >= 0;
}

struct node {
    int s, e, m, v[2][2]; // 0 = no take first/last, 1 = take
    node *l, *r;
    node(int _s, int _e) {
        s = _s, e = _e, m = (s+e)/2, v[0][0] = v[0][1] = v[1][0] = v[1][1] = 0;
        if(s != e) {
            l = new node(s, m);
            r = new node(m+1, e);
        }
    }
    void update(int x, int val) {
        if(s == e) {
            v[1][1] = abs(val);
            return;
        } else if(x > m) r->update(x, val);
        else l->update(x, val);
        if(sgn(a[m]) == sgn(a[m+1])) {
            for(int i = 0; i < 2; i++) for(int j = 0; j < 2; j++) {
                v[i][j] = 0;
                for(int k = 0; k < 2; k++) for(int k1 = 0; k1 < 2; k1++) {
                    v[i][j] = max(v[i][j], l->v[i][k] + r->v[k1][j]);
                }
            }
        } else {
            for(int i = 0; i < 2; i++) for(int j = 0; j < 2; j++) {
                v[i][j] = 0;
                for(int k = 0; k < 2; k++) for(int k1 = 0; k1 < 2; k1++) {
                    if(k == 1 && k1 == 1) continue;
                    v[i][j] = max(v[i][j], l->v[i][k] + r->v[k1][j]);
                }
            }
        }
    }
    int get() {
        int ans = 0;
        for(int i = 0; i < 2; i++) for(int j = 0; j < 2; j++) ans = max(ans, v[i][j]);
        return ans;
    }
} *root;

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int n, q, l, r, x;
    cin >> n >> q;
    int b[n];
    for(int i = 0; i < n; i++) {
        cin >> b[i];
    }
    root = new node(0, n);
    for(int i = 1; i < n; i++) {
        a[i] = b[i]-b[i-1];
        root->update(i, a[i]);
    }
    while(q--) {
        cin >> l >> r >> x;
        if(l-1 >= 1) {
            a[l-1] += x;
            root->update(l-1, a[l-1]);
        }
        if(r < n) {
            a[r] -= x;
            root->update(r, a[r]);
        }
        cout << root->get() << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...