#include <bits/stdc++.h>
// #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx,avx2,fma")
// #pragma GCC optimization("unroll-loops")
// #pragma ("reroll")
#define all(v) v.begin(), v.end()
#define skip continue;
#define gold ios_base::sync_with_stdio(false);cin.tie(NULL);
#define xa "\n"
#define int long long
#define pb push_back
#define S second
#define F first
using namespace std;
const int mod = 1e9 + 7;
const int N = 1e6 + 7;
const int MAX = 1e9;
const int inf = 1e18;
int gcd(int a, int b) { if (b == 0) return a; else if(a == 0) return b; else return gcd(b, a % b); }
int lcm(int a, int b) { return a / gcd(a, b) * b; }
int n, q, s, t;
int a[N];
int tree[N * 4];
int lazy[N * 4];
int temp[N];
void push(int v){
tree[v] += lazy[v];
lazy[v * 2] += lazy[v];
lazy[v * 2 + 1] += lazy[v];
lazy[v] = 0;
}
int get(int v, int tl, int tr, int l, int r){
push(v);
if(tr < l || r < tl) return 0;
if(l <= tl && tr <= r) return tree[v];
int tm = (tl + tr) / 2;
return get(v * 2, tl, tm, l, r) + get(v * 2 + 1, tm + 1, tr, l, r);
}
void upd(int v, int tl, int tr, int l, int r, int x){
push(v);
if(tr < l || r < tl) return;
if(l <= tl && tr <= r){
lazy[v] += x;
push(v);
return;
}
int tm = (tl + tr) / 2;
upd(v * 2, tl, tm, l, r, x);
upd(v * 2 + 1, tm + 1, tr, l, r, x);
}
void solve() {
cin >> n >> q >> s >> t;
for(int i = 0; i <= n; i++){
cin >> a[i];
}
int sum = 0;
for(int i = 1; i <= n; i++){
if(a[i - 1] < a[i]){
temp[i] = ((a[i - 1] - a[i]) * s);
}
else {
temp[i] = ((a[i - 1] - a[i]) * t);
}
sum += temp[i];
upd(1, 1, n, i, i, a[i]);
}
while(q--){
int l, r, x;
cin >> l >> r >> x;
upd(1, 1, n, l, r, x);
if(r + 1 <= n){
int R = get(1, 1, n, r, r);
int Rnext = get(1, 1, n, r + 1, r + 1);
sum -= temp[r + 1];
if(R < Rnext){
temp[r + 1] = ((R - Rnext) * s);
}
else {
temp[r + 1] = ((R - Rnext) * t);
}
sum += temp[r + 1];
}
if(l == 1){
int L = get(1, 1, n, l, l);
int Lprev = 0;
sum -= temp[l];
if(Lprev < L){
temp[l] = ((Lprev - L) * s);
}
else {
temp[l] = ((Lprev - L) * t);
}
sum += temp[l];
}
if(l - 1 >= 1){
int L = get(1, 1, n, l, l);
int Lprev = get(1, 1, n, l - 1, l - 1);
sum -= temp[l];
if(Lprev < L){
temp[l] = ((Lprev - L) * s);
}
else {
temp[l] = ((Lprev - L) * t);
}
sum += temp[l];
}
// for(int i = 1; i <= n; i++){
// cout << get(1, 1, n, i, i) << ' ' << temp[i] << xa;
// }
cout << sum << xa;
}
}
/*
1 2
0 4 1 8 5 7 3
0 -4 2 -5 1 -1 7
0 6 3 10 7 7 3 <- +2 -> [1, 4]
0 -6 0 -7 -1 -1 7
0 4 1 11 8 7 3 <- +3 -> [3, 4]
0 -4 2 -8 -2 0 8
0 8 1 8 5 7 3 <- +4 -> [1, 1]
0 -8 6 -1 5 3 11
*/
signed main() {
gold;
//freopen("knight.in", "r", stdin);
//freopen("knight.out", "w", stdout);
int t = 1;
int tt = 0;
//cin >> t;
while (t--) {
tt++;
//cout << "Case " << tt << ":" << xa;
solve();
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |