제출 #1330992

#제출 시각아이디문제언어결과실행 시간메모리
1330992teslerphamSjeckanje (COCI21_sjeckanje)C++20
110 / 110
1379 ms62916 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define el '\n'

using pii = pair<int,int>;
using vi = vector<int>;
const int N = 2e5 + 5;
const int INF = 1e16;
const int MOD = 1e9 + 7;


void fastIO() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
}
int a[N], b[N];
struct Node{
    int dp[3][3];
    // dp[đầu][cuối]
    // 0: (-)    1: (+)   2: (0)
    Node(){
        for(int i = 0; i < 3; i++){
            for(int j = 0; j < 3; j++){
                dp[i][j] = -INF;
            }
        }
    }
}st[4*N];

void set_node(int id, int val) {
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            st[id].dp[i][j] = -INF;
        }
    }
    st[id].dp[2][2] = 0;
    if(val > 0) st[id].dp[1][1] = val;
    if(val < 0) st[id].dp[0][0] = -val;
}

Node merge(const Node& L, const Node& R) {
    Node res;
    for (int i = 0; i < 3; i++) {         // đầu trái
        for (int j = 0; j < 3; j++) {     // cuối phải
            for (int k = 0; k < 3; k++) { // cuối trái
                for (int l = 0; l < 3; l++) { // đầu phải
                    if ((k == 0 && l == 1) || (k == 1 && l == 0)) continue;

                    if (L.dp[i][k] != -INF && R.dp[l][j] != -INF) {
                        res.dp[i][j] = max(res.dp[i][j], L.dp[i][k] + R.dp[l][j]);
                    }
                }
            }
        }
    }
    return res;
}

void build(int id, int l, int r) {
    if (l == r) {
        set_node(id, b[l]);
        return;
    }
    int mid = (l + r) / 2;
    build(2 * id, l, mid);
    build(2 * id + 1, mid + 1, r);
    st[id] = merge(st[2 * id], st[2 * id + 1]);
}

void update(int id, int l, int r, int idx, int val) {
    if (l == r) {
        b[l] += val;
        set_node(id, b[l]);
        return;
    }
    int mid = (l + r) / 2;
    if (idx <= mid) update(2 * id, l, mid, idx, val);
    else update(2 * id + 1, mid + 1, r, idx, val);
    st[id] = merge(st[2 * id], st[2 * id + 1]);
}
signed main() {
    fastIO();
    #define task "a"
    //freopen(task".inp","r",stdin);
    //freopen(task".out","w",stdout);
    int n, q; cin >> n >> q;

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

    for(int i = 2; i <= n; i++){
        b[i-1] = a[i] - a[i-1];
    }
    build(1, 1, n-1);

    while(q--){
        int l, r, x; cin >> l >> r >> x;
        if (l > 1) update(1, 1, n - 1, l - 1, x);
        if (r < n) update(1, 1, n - 1, r, -x);

        int ans = 0;

        for (int i = 0; i < 3; i++){
            for (int j = 0; j < 3; j++){
                ans = max(ans, st[1].dp[i][j]);
            }
        }
            
        
        cout << ans << el;
    }
    return 0;
}
// Yêu Linh Đan hơn yêu code
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...