维护sum,如果在修改的时候和小于0就中止.
#include <bits/stdc++.h>
#define LC tr[u << 1]
#define RC tr[u << 1 | 1]
#define PA tr[u]
#define LEN(TR) (TR.r - TR.l + 1)
using namespace std;
using ll = long long;
const int N = 1e6 + 10;
struct node_t {
int l, r;
ll sum, tag;
} tr[4 * N];
inline int read() {
int cur{};
char ch = getchar();
for (; !isdigit(ch); ch = getchar())
;
for (; isdigit(ch); ch = getchar())
cur = (cur << 1) + (cur << 3) + (ch ^ 48);
return cur;
}
void pushup(int u) {
PA.sum = LC.sum + RC.sum;
}
void pushdown(int u) {
if (PA.tag) {
LC.tag += PA.tag;
RC.tag += PA.tag;
LC.sum += PA.tag * LEN(LC);
RC.sum += PA.tag * LEN(RC);
PA.tag = 0;
}
}
void build(int u, int l, int r) {
PA.l = l, PA.r = r;
if (PA.l == PA.r) {
PA.sum = read();
}
else {
int mid = PA.l + PA.r >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
bool modify(int u, int l, int r, int x) {
if (l <= PA.l && PA.r <= r) {
PA.sum += (ll)x * LEN(PA);
PA.tag += x;
return PA.sum >= 0;
}
else {
pushdown(u);
int mid = PA.l + PA.r >> 1;
bool res = true;
if (l <= mid)
res &= modify(u << 1, l, r, x);
if (mid < r)
res &= modify(u << 1 | 1, l, r, x);
pushup(u);
return res;
}
}
signed main() {
#ifndef ONLINE_JUDGE
freopen(".in", "r", stdin);
#else
ios::sync_with_stdio(false);
#endif
cin.tie(0);
int n = read(), m = read();
build(1, 1, n);
for (int i = 1; i <= m; ++i) {
int d = read(), s = read(), t = read();
if (modify(1, s, t, -d) == false) {
cout << "-1\n" << i;
return 0;
}
}
cout << 0;
return 0;
}