#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |