#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int a[N], b[N];
int sg(int x) {
return (x == 0 ? 0 : x < 0 ? -1 : 1);
}
struct {
struct node {
long long vl, vr, dp[2][2];
void set(int x) {
vl = vr = x;
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
dp[i][j] = 0;
}
}
dp[1][1] = abs(x);
}
void merge(node& l, node& r) {
vl = l.vl, vr = r.vr;
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
dp[i][j] = 0;
}
}
for (int a = 0; a < 2; ++a) {
for (int b = 0; b < 2; ++b) {
for (int c = 0; c < 2; ++c) {
for (int d = 0; d < 2; ++d) {
if (b && c) {
if (sg(l.vr) != sg(r.vl)) continue;
dp[a][d] = max(dp[a][d], l.dp[a][b] + r.dp[c][d]);
} else {
dp[a][d] = max(dp[a][d], l.dp[a][b] + r.dp[c][d]);
}
}
}
}
}
}
};
node t[4 * N];
void build(int v, int tl, int tr) {
if (tl == tr) {
t[v].set(b[tl]);
return;
}
int tm = (tl + tr) >> 1;
build(v << 1, tl, tm);
build(v << 1 | 1, tm + 1, tr);
t[v].merge(t[v << 1], t[v << 1 | 1]);
}
void update(int v, int tl, int tr, int l, int x) {
if (tl == tr) {
t[v].set(x);
return;
}
int tm = (tl + tr) >> 1;
if (l <= tm) {
update(v << 1, tl, tm, l, x);
} else {
update(v << 1 | 1, tm + 1, tr, l, x);
}
t[v].merge(t[v << 1], t[v << 1 | 1]);
}
int get() {
return t[1].dp[1][1];
}
} T;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
for (int i = 1; i < n; ++i) {
b[i] = a[i + 1] - a[i];
}
T.build(1, 1, n - 1);
for (int i = 0; i < q; ++i) {
int l, r, x;
cin >> l >> r >> x;
if (l - 1 >= 1) {
b[l - 1] += x;
T.update(1, 1, n - 1, l - 1, b[l - 1]);
}
if(r <= n - 1) {
b[r] -= x;
T.update(1, 1, n - 1, r, b[r]);
}
cout << T.get() << "\n";
}
return 0;
}