#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define pb push_back
#define int long long
const int N = 1e6+100;
int n, q, a[N], d[N], dp[N * 4][2][2], L[N * 4], R[N * 4];
void merge(int v, int v2, int v3){
L[v] = L[v2];
R[v] = R[v3];
for(int i = 0; i < 2; i++){
for(int j = 0; j < 2; j++) dp[v][i][j] = 0;
}
for(int lft = 0; lft < 2; lft++){
for(int m = 0; m < 2; m++){
for(int o = 0; o < 2; o++){
for(int rgt = 0; rgt < 2; rgt++){
if((m && o) && (R[v2]==0 || L[v3]==0)) continue;
if((m && o) && (R[v2]<0) != (L[v3]<0)) continue;
dp[v][lft][rgt] = max(dp[v][lft][rgt], dp[v2][lft][m] + dp[v3][o][rgt]);
}
}
}
}
}
void build(int v, int l, int r){
if(l == r){
dp[v][0][0] = dp[v][0][1] = dp[v][1][0] = 0;
L[v] = R[v] = d[l];
dp[v][1][1] = (d[l]!=0 ? abs(d[l]) : 0);
return;
}
int m = (l + r) / 2;
build(v + v, l, m);
build(v + v + 1, m + 1, r);
merge(v, v + v, v + v + 1);
}
void upd(int v, int l, int r, int pos, int x){
if(l == r){
L[v] += x;
R[v] += x;
dp[v][1][1] = (L[v]!=0 ? abs(L[v]) : 0);
dp[v][0][0] = dp[v][0][1] = dp[v][1][0] = 0;
return;
}
int m = (l + r) / 2;
if(pos <= m) upd(v + v, l, m, pos, x);
else upd(v + v + 1, m + 1, r, pos, x);
merge(v, v + v, v + v + 1);
}
void solve(){
cin >> n >> q;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i < n; i++) d[i] = a[i + 1] - a[i];
build(1, 1, n - 1);
while(q--){
int l, r, x;
cin >> l >> r >> x;
if(l-1 >= 1) upd(1, 1, n-1, l-1, x);
if(r < n) upd(1, 1, n-1, r, -x);
cout << dp[1][1][1] << '\n';
}
}
signed main(){
ios_base::sync_with_stdio(0); cin.tie(0);
//freopen("promote.in","r",stdin);
//freopen("promote.out","w",stdout);
int tt=1;
// cin >> tt;
while(tt--){
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... |