#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf = 1e18;
int nodemtp[3] = {0,-1,1};
struct Node{
ll arr[3][3];
ll mn, mx, lz;
Node(){
for(int i = 0; i < 3; i++)
fill(arr[i],arr[i]+3,-inf);
lz = 0;
}
void leaf(int x){
mn = x, mx = x;
arr[0][0] = 0;
arr[1][0] = -x;
arr[2][0] = x;
arr[0][1] = -x;
arr[0][2] = x;
}
void apply(ll x){
mn += x, mx += x, lz += x;
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++){
arr[i][j] += x*(nodemtp[i]+nodemtp[j]);
if(arr[i][j] < -inf) arr[i][j] = -inf;
}
}
};
Node operator+(const Node &a, const Node &b){
Node res;
res.mn = min(a.mn,b.mn);
res.mx = max(a.mx,b.mx);
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
res.arr[i][j] = max(res.arr[i][j],a.arr[i][0]+b.arr[0][j]);
res.arr[i][j] = max(res.arr[i][j],a.arr[i][1]+b.arr[2][j]);
res.arr[i][j] = max(res.arr[i][j],a.arr[i][2]+b.arr[1][j]);
res.arr[i][j] = max(res.arr[i][j],a.arr[i][j]);
res.arr[i][j] = max(res.arr[i][j],b.arr[i][j]);
}
}
return res;
}
const int mxn = 2e5;
int arr[mxn+1];
Node st[1<<19];
void push(int i){
if(st[i].lz){
st[i<<1].apply(st[i].lz);
st[i<<1|1].apply(st[i].lz);
st[i].lz = 0;
}
}
void build(int i, int l, int r){
if(l==r){st[i].leaf(arr[l]); return;}
int m = (l+r)>>1;
build(i<<1,l,m);
build(i<<1|1,m+1,r);
st[i] = st[i<<1] + st[i<<1|1];
}
void rangeAdd(int i, int l, int r, int s, int e, int v){
if(r < s || l > e) return;
if(s <= l && r <= e){st[i].apply(v); return;}
int m = (l+r)>>1; push(i);
rangeAdd(i<<1,l,m,s,e,v);
rangeAdd(i<<1|1,m+1,r,s,e,v);
st[i] = st[i<<1] + st[i<<1|1];
}
void solve(){
int n,q; cin >> n >> q;
for(int i = 1; i <= n; i++)
cin >> arr[i];
build(1,1,n);
for(int t = 0; t < q; t++){
int l,r,x; cin >> l >> r >> x;
rangeAdd(1,1,n,l,r,x);
cout << st[1].arr[0][0] << '\n';
}
}
signed main(){
cin.tie(0)->sync_with_stdio(false);
int t = 1;
while(t--){solve();}
}