Submission #1352508

#TimeUsernameProblemLanguageResultExecution timeMemory
1352508i_love_springSjeckanje (COCI21_sjeckanje)C++20
15 / 110
2095 ms688 KiB
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

const long long INF = 1e18;
int n, q;
vector<long long> A;
vector<long long> dp;

vector<long long> tree, lazy;

void push(int node) {
    if (lazy[node] != 0) {
        lazy[2 * node] += lazy[node];
        tree[2 * node] += lazy[node];
        lazy[2 * node + 1] += lazy[node];
        tree[2 * node + 1] += lazy[node];
        lazy[node] = 0;
    }
}

void update(int node, int l, int r, int ql, int qr, long long val) {
    if (ql > r || qr < l) return;
    if (ql <= l && r <= qr) {
        tree[node] += val;
        lazy[node] += val;
        return;
    }
    push(node);
    int mid = l + (r - l) / 2;
    update(2 * node, l, mid, ql, qr, val);
    update(2 * node + 1, mid + 1, r, ql, qr, val);
    tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}

long long query(int node, int l, int r, int ql, int qr) {
    if (ql > r || qr < l) return -INF;
    if (ql <= l && r <= qr) return tree[node];
    push(node);
    int mid = l + (r - l) / 2;
    return max(query(2 * node, l, mid, ql, qr),
               query(2 * node + 1, mid + 1, r, ql, qr));
}

long long solve_dp() {
    fill(tree.begin(), tree.begin() + 4 * (n + 1), 0);
    fill(lazy.begin(), lazy.begin() + 4 * (n + 1), 0);
    
    stack<int> max_stack, min_stack;
    
    dp[0] = 0;
    
    for (int i = 1; i <= n; ++i) {
        while (!max_stack.empty() && A[max_stack.top()] <= A[i]) {
            int t = max_stack.top();
            max_stack.pop();
            int L = max_stack.empty() ? 0 : max_stack.top();
            update(1, 0, n, L, t - 1, A[i] - A[t]);
        }
        update(1, 0, n, i - 1, i - 1, A[i]);
        max_stack.push(i);

        while (!min_stack.empty() && A[min_stack.top()] >= A[i]) {
            int t = min_stack.top();
            min_stack.pop();
            int L = min_stack.empty() ? 0 : min_stack.top();
            update(1, 0, n, L, t - 1, A[t] - A[i]);
        }
        update(1, 0, n, i - 1, i - 1, -A[i]);
        min_stack.push(i);

        dp[i] = query(1, 0, n, 0, i - 1);

        if (i < n) {
            update(1, 0, n, i, i, dp[i]);
        }
    }
    
    return dp[n];
}

int main() {
    // Optimize I/O
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n >> q;
    
    A.assign(n + 1, 0);
    dp.assign(n + 1, 0);
    tree.assign(4 * (n + 1), 0);
    lazy.assign(4 * (n + 1), 0);

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

    for (int i = 0; i < q; ++i) {
        int l, r;
        long long x;
        cin >> l >> r >> x;
        for (int j = l; j <= r; ++j) {
            A[j] += x;
        }
        cout << solve_dp() << "\n";
    }

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