Submission #989984

#TimeUsernameProblemLanguageResultExecution timeMemory
989984yanbFoehn Phenomena (JOI17_foehn_phenomena)C++14
100 / 100
681 ms24148 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

struct SegTree {
    int n;
    vector<int> st, add;

    void push(int v, int vl, int vr) {
        st[v] += add[v] * (vr - vl + 1);
        if (vl != vr) {
            add[v * 2] += add[v];
            add[v * 2 + 1] += add[v];
        }
        add[v] = 0;
    }

    void update(int l, int r, int x, int v, int vl, int vr) {
        push(v, vl, vr);
        if (r < vl || vr < l) return;
        if (l <= vl && vr <= r) {
            add[v] += x;
            push(v, vl, vr);
            return;
        }
        int vm = (vl + vr) / 2;
        update(l, r, x, v * 2, vl, vm);
        update(l, r, x, v * 2 + 1, vm + 1, vr);
        st[v] = st[v * 2] + st[v * 2 + 1];
    }

    SegTree(int n, vector<int> &a) {
        this->n = n;
        st.resize(4 * n);
        add.resize(4 * n);
        for (int i = 0; i < n; i++) {
            update(i, i, a[i], 1, 0, n - 1);
        }
    }

    int get(int l, int r, int v, int vl, int vr) {
        push(v, vl, vr);
        if (r < vl || vr < l) return 0;
        if (l <= vl && vr <= r) return st[v];
        int vm = (vl + vr) / 2;
        return get(l, r, v * 2, vl, vm) + get(l, r, v * 2 + 1, vm + 1, vr);
    }

    int get(int pos) {
        return get(pos, pos, 1, 0, n - 1);
    }
};

int f(int x, int y, int s, int t) {
    return (x < y ? s * (x - y) : t * (x - y));
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, q, s, t;
    cin >> n >> q >> s >> t;
    n++;
    vector<int> a(n);
    for (int i = 0; i < n; i++) cin >> a[i];

    SegTree st(n, a);

    int ans = 0;
    for (int i = 0; i < n - 1; i++) {
        ans += f(a[i], a[i + 1], s, t);
    }

    while (q--) {
        int l, r, x;
        cin >> l >> r >> x;
        ans -= f(st.get(l - 1), st.get(l), s, t);
        if (r < n - 1) ans -= f(st.get(r), st.get(r + 1), s, t);
        st.update(l, r, x, 1, 0, n - 1);
        ans += f(st.get(l - 1), st.get(l), s, t);
        if (r < n - 1) ans += f(st.get(r), st.get(r + 1), s, t);

        cout << ans << "\n";
    }
}   
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...