Submission #1199463

#TimeUsernameProblemLanguageResultExecution timeMemory
1199463efishelFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
86 ms7348 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector <ll>;
using ii = pair <ll, ll>;
using vii = vector <ii>;

struct Fenwick {
    vll tree;
    ll n;

    Fenwick (ll n): tree(n, 0), n(n) {}

    void update (ll l, ll r, ll val) { update(l, val); update(r+1, -val); }
    void update (ll id, ll val) {
        for (; id < n; id |= id+1) tree[id] += val;
    }

    ll query (ll id) {
        ll ans = 0;
        for (; id >= 0; id &= id+1, id--) ans += tree[id];
        return ans;
    }
};

int main () {
    cin.tie(nullptr) -> sync_with_stdio(false);
    ll n, Q, vP, vM;
    cin >> n >> Q >> vP >> vM;
    vll ve(n+1);
    for (ll &i : ve) cin >> i;
    Fenwick ft(n+1);
    for (ll i = 0; i < n+1; i++) {
        ft.update(i, i, ve[i]);
    }
    ll ans = 0;
    for (ll i = 1; i < n+1; i++) {
        ll diff = ve[i] - ve[i-1];
        if (diff > 0)
            ans -= vP*diff;
        else
            ans -= vM*diff;
    }
    const auto fgetDiff = [&](ll i) -> ll {
        assert(i > 0);
        if (i >= n+1) return 0;
        return ft.query(i) - ft.query(i-1);
    };
    const auto fadjDelta = [&](ll i, ll mult) {
        ll diff = fgetDiff(i);
        if (diff > 0)
            ans -= vP*diff*mult;
        else
            ans -= vM*diff*mult;
    };
    while (Q--) {
        ll ql, qr, val;
        cin >> ql >> qr >> val;
        fadjDelta(ql  , -1);
        fadjDelta(qr+1, -1);
        ft.update(ql, qr, val);
        fadjDelta(ql  , +1);
        fadjDelta(qr+1, +1);
        cout << ans << '\n';
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...