#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
const long long INF = 1e18;
int n, q;
vector<long long> A;
vector<long long> dp;
vector<long long> tree, lazy;
void push(int node) {
if (lazy[node] != 0) {
lazy[2 * node] += lazy[node];
tree[2 * node] += lazy[node];
lazy[2 * node + 1] += lazy[node];
tree[2 * node + 1] += lazy[node];
lazy[node] = 0;
}
}
void update(int node, int l, int r, int ql, int qr, long long val) {
if (ql > r || qr < l) return;
if (ql <= l && r <= qr) {
tree[node] += val;
lazy[node] += val;
return;
}
push(node);
int mid = l + (r - l) / 2;
update(2 * node, l, mid, ql, qr, val);
update(2 * node + 1, mid + 1, r, ql, qr, val);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
long long query(int node, int l, int r, int ql, int qr) {
if (ql > r || qr < l) return -INF;
if (ql <= l && r <= qr) return tree[node];
push(node);
int mid = l + (r - l) / 2;
return max(query(2 * node, l, mid, ql, qr),
query(2 * node + 1, mid + 1, r, ql, qr));
}
long long solve_dp() {
fill(tree.begin(), tree.begin() + 4 * (n + 1), 0);
fill(lazy.begin(), lazy.begin() + 4 * (n + 1), 0);
stack<int> max_stack, min_stack;
dp[0] = 0;
for (int i = 1; i <= n; ++i) {
while (!max_stack.empty() && A[max_stack.top()] <= A[i]) {
int t = max_stack.top();
max_stack.pop();
int L = max_stack.empty() ? 0 : max_stack.top();
update(1, 0, n, L, t - 1, A[i] - A[t]);
}
update(1, 0, n, i - 1, i - 1, A[i]);
max_stack.push(i);
while (!min_stack.empty() && A[min_stack.top()] >= A[i]) {
int t = min_stack.top();
min_stack.pop();
int L = min_stack.empty() ? 0 : min_stack.top();
update(1, 0, n, L, t - 1, A[t] - A[i]);
}
update(1, 0, n, i - 1, i - 1, -A[i]);
min_stack.push(i);
dp[i] = query(1, 0, n, 0, i - 1);
if (i < n) {
update(1, 0, n, i, i, dp[i]);
}
}
return dp[n];
}
int main() {
// Optimize I/O
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> q;
A.assign(n + 1, 0);
dp.assign(n + 1, 0);
tree.assign(4 * (n + 1), 0);
lazy.assign(4 * (n + 1), 0);
for (int i = 1; i <= n; ++i) {
cin >> A[i];
}
for (int i = 0; i < q; ++i) {
int l, r;
long long x;
cin >> l >> r >> x;
for (int j = l; j <= r; ++j) {
A[j] += x;
}
cout << solve_dp() << "\n";
}
return 0;
}