Submission #1364585

#TimeUsernameProblemLanguageResultExecution timeMemory
1364585madamadam3Foehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
78 ms7240 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long int
const int INF = 4e18;

/*
fenwick tree
*/

struct Fenw {
    int n; vector<int> BIT;
    Fenw(int n = 0) : n(n), BIT(n, 0) {}
    void update(int i, int delta) {for (; i < n; i |= i+1) BIT[i] += delta;}
    int query(int i) {int r = 0; for (; i >= 0; i &= i+1, i--) r += BIT[i]; return r;}
};

signed main() {
    cin.tie(0)->sync_with_stdio(0);

    int n,q,s,t; cin >> n >> q >> s >> t;
    auto f1 = Fenw(n+1), f2 = Fenw(n+1);

    for (int i = 0; i <= n; i++) {int x; cin >> x; f1.update(i, x); f1.update(i+1, -x);}

    auto cost = [&](int cur, int prev) {
        int d = cur - prev;
        if (d > 0) return -s * d;
        return -t * d;
    };

    for (int i = 1; i <= n; i++) {
        int u = f1.query(i), v = f1.query(i-1);
        f2.update(i, cost(u,v));
    }

    while (q--) {
        int l, r, x; cin >> l >> r >> x;
        int left = f1.query(l-1);
        int cl = f1.query(l);

        f2.update(l, -cost(cl, left));

        int cr, right;
        if (r < n) {
            cr = f1.query(r);
            right = f1.query(r+1);
            f2.update(r+1, -cost(right, cr));
        }

        f1.update(l, x);
        f1.update(r+1, -x);

        int nl = f1.query(l);
        f2.update(l, cost(nl, left));

        if (r < n) {
            int nr = f1.query(r);
            f2.update(r+1, cost(right, nr));
        }
        cout << f2.query(n) << "\n";
    }
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...