#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define int ll
using P = pair<int, int>;
#define all(x) x.begin(), x.end()
#define rep(i, l, n) for (int i = l; i < (n); ++i)
#define sz(x) (int)x.size()
const char nl = '\n';
const int mod = 1e9+7;
struct arr{
vector<int> tree;
int size;
void init(int n) {
size = 1;
while (size < n)size <<= 1;
tree.assign(2*size-1, 0);
}
void gos(int i, int v, int x, int lx, int rx) {
if (rx-lx == 1) {
tree[x] += v;
return;
}
int mid = lx+rx>>1;
if(i<mid)gos(i, v, 2*x+1, lx, mid);
else gos(i, v, 2*x+2, mid, rx);
tree[x] = tree[2*x+1]+tree[2*x+2];
}
void gos(int i, int v) {
gos(i, v, 0, 0, size);
}
int get(int r, int x, int lx, int rx) {
if (lx >= r)return 0;
if (rx <= r)return tree[x];
int mid = lx+rx>>1;
return get(r, 2*x+1, lx, mid)+get(r, 2*x+2, mid, rx);
}
int get(int r) {
return get(r, 0, 0, size);
}
};
struct segtree{
vector<int> tree;
int size;
void init(int n) {
size = 1;
while (size < n)size <<= 1;
tree.assign(2*size-1, 0);
}
void gos(int i, int v, int x, int lx, int rx) {
if (rx-lx==1) {
tree[x] += v;
return;
}
int mid = lx+rx>>1;
if(i<mid)gos(i, v, 2*x+1, lx, mid);
else gos(i, v, 2*x+2, mid, rx);
tree[x] = tree[2*x+1]+tree[2*x+2];
}
void gos(int i, int v) {
gos(i, v, 0, 0, size);
}
};
int n, q, s, t;
int f(int a, int b) {
if (a >= b)return (a-b)*t;
return (a-b)*s;
}
void solve() {
cin >> n >> q >> s >> t;
vector<int> a(n+1), b(n+1);
for (auto &i: a)cin >> i;
arr U;
U.init(n+5);
segtree st;
st.init(n+5);
rep(i, 1, n+1)
st.gos(i, f(a[i-1], a[i]));
rep(i, 0, q) {
int l, r, x; cin >> l >> r >> x;
b[l-1] = a[l-1]+U.get(l), b[l] = a[l]+U.get(l+1);
b[r] = a[r]+U.get(r+1); if (r+1 <= n)b[r+1] = a[r+1]+U.get(r+2);
int cur = st.tree[0]-f(b[l-1], b[l])-(r+1<=n?f(b[r], b[r+1]): 0ll);
st.gos(l, -f(b[l-1], b[l]));
if (r+1 <= n)st.gos(r+1, -f(b[r], b[r+1]));
//if (i == 1)cout << "!!" <<b[r] + x<< nl;
U.gos(l, x), U.gos(r+1, -x); b[l] += x;
if (r != l)b[r] += x;
//if (i == 1)cout << "!!" << b[r] << nl;
st.gos(l, +f(b[l-1], b[l]));
if (r+1 <= n)st.gos(r+1, +f(b[r], b[r+1]));
cur += f(b[l-1], b[l])+(r+1<=n?f(b[r], b[r+1]): 0ll);
//if (i == 1)cout << "!!" <<b[r]<< nl;
cout << cur << nl;
b[l] = b[l+1] = b[r] = 0;
if (r+1<=n)b[r+1] = 0;
}
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
solve();
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... |