Submission #996677

#TimeUsernameProblemLanguageResultExecution timeMemory
996677overwatch9Foehn Phenomena (JOI17_foehn_phenomena)C++17
100 / 100
665 ms29012 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;
struct node {
    ll val = 0;
    bool pd = false;
    ll lz = 0;
};
struct stree {
    #define lc v*2
    #define rc v*2+1
    vector <node> tree;
    stree (int s) {
        tree.resize(s * 4);
    }
    void pushdown(int v) {
        if (!tree[v].pd)
            return;
        tree[v].pd = false;
        tree[lc].pd = tree[rc].pd = true;
        tree[lc].lz += tree[v].lz;
        tree[rc].lz += tree[v].lz;
        tree[v].lz = 0;
    }
    void update(int v, int tl, int tr, int l, int r, ll delta) {
        if (tl > r || tr < l)
            return;
        if (tl >= l && tr <= r) {
            tree[v].lz += delta;
            tree[v].pd = true;
            return;
        }
        pushdown(v);
        int tm = (tl + tr) / 2;
        update(lc, tl, tm, l, r, delta);
        update(rc, tm+1, tr, l, r, delta);
    }
    ll query(int v, int tl, int tr, int p) {
        if (tl == tr)
            return tree[v].lz + tree[v].val;
        pushdown(v);
        int tm = (tl + tr) / 2;
        if (tm >= p && tl <= p)
            return query(lc, tl, tm, p);
        else
            return query(rc, tm+1, tr, p);
    }
};
int main() {
    int N, Q;
    ll S, T;
    cin >> N >> Q >> S >> T;
    vector <ll> a(N+1);
    for (int i = 0; i <= N; i++)
        cin >> a[i];
    stree tree(N+3);
    int sz = N+2;
    for (int i = 0; i <= N; i++)
        tree.update(1, 0, sz, i, i, a[i]);
    ll ans = 0;
    for (int i = 0; i+1 <= N; i++) {
        if (a[i] < a[i+1])
            ans -= S * (a[i+1] - a[i]);
        else
            ans += T * (a[i] - a[i+1]);
    }
    while (Q--) {
        int l, r, x;
        cin >> l >> r >> x;
        ll a = tree.query(1, 0, sz, l-1);
        ll b = tree.query(1, 0, sz, l);
        ll c = tree.query(1, 0, sz, r);
        ll d = tree.query(1, 0, sz, r+1);
        if (a < b)
            ans += S * (b - a);
        else
            ans -= T * (a - b);
        if (r+1 <= N) {
            if (c < d)
                ans += S * (d - c);
            else
                ans -= T * (c - d);
        }

        b += x;
        c += x;

        if (a < b)
            ans -= S * (b - a);
        else
            ans += T * (a - b);
        
        if (r+1 <= N) {
            if (c < d)
                ans -= S * (d - c);
            else
                ans += T * (c - d);
        }
        
        tree.update(1, 0, sz, l, r, x);
        cout << ans << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...