#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 200'000 + 10;
const long long INF = 1e16;
int n, q, arr[MAX_N];
struct Node {
long long dp[2][2], st, en;
Node(long long x = 0) : st(x), en(x) {
dp[1][1] = abs(x);
dp[0][0] = dp[0][1] = dp[1][0] = 0;
}
Node(const Node& lc, const Node& rc) {
st = lc.st;
en = rc.en;
bool limited = (lc.en < 0 && rc.st > 0) || (lc.en > 0 && rc.st < 0);
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
dp[i][j] = 0;
for (int k = 0; k < 2; ++k) {
for (int l = 0; l < 2; ++l) {
if (k + l == 2 && limited) continue;
dp[i][j] = max(dp[i][j], lc.dp[i][k] + rc.dp[l][j]);
}
}
}
}
}
} tree[4 * MAX_N];
void build(int id = 1, int l = 1, int r = n) {
if (r - l == 1) {
tree[id] = arr[l + 1] - arr[l];
} if (r - l > 1) {
int mid = (l + r) >> 1;
build(id << 1, l, mid);
build(id << 1 | 1, mid, r);
tree[id] = {tree[id << 1], tree[id << 1 | 1]};
}
}
void modify(int i, long long x, int id = 1, int l = 1, int r = n) {
if (r - l == 1) {
tree[id] = tree[id].st + x;
} else {
int mid = (l + r) >> 1;
if (i < mid) {
modify(i, x, id << 1, l, mid);
} else {
modify(i, x, id << 1 | 1, mid, r);
}
tree[id] = {tree[id << 1], tree[id << 1 | 1]};
}
}
long long get() {
long long res = 0;
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
res = max(res, tree[1].dp[i][j]);
}
}
return res;
}
int main() {
cin >> n >> q;
for (int i = 1; i <= n; ++i) {
cin >> arr[i];
}
build();
while (q--) {
int l, r, x;
cin >> l >> r >> x;
if (l > 1) modify(l - 1, x);
if (r < n) modify(r, -x);
cout << get() << '\n';
}
}