
1 #include<iostream> 2 #include<string> 3 #include<queue> 4 #include<stack> 5 #include<vector> 6 #include<map> 7 #include<cstdio> 8 #include<cstdlib> 9 #include<algorithm> 10 #include<set> 11 #include<list> 12 #include<iomanip> 13 #include<cstring> 14 #include<cmath> 15 #include<limits> 16 using namespace std; 17 18 #define au auto 19 #define debug(i) cout<<"<debug> "<<i<<"<\debug>"<<endl 20 #define mfor(i,a,b) for(register int i=(a);i<=(b);i++) 21 #define mrep(i,a,b) for(register int i=(a);i>=(b);i--) 22 #define LLL __int128 23 #define Re register 24 #define il inline 25 #define mem(a,b) memset(a,(b),sizeof(a)) 26 typedef pair<int, int> intpair; 27 typedef long long int LL; 28 const int INF = 0x3f3f3f3f; 29 const long long int INFLL = 0x3f3f3f3f3f3f3f3f; 30 31 const int maxn = 5000010; 32 int a[maxn]; 33 int n, m; 34 35 #define lc(x) x<<1 36 #define rc(x) x<<1|1 37 38 il int min(int a, int b) 39 { 40 return a > b ? b : a; 41 } 42 43 struct tree 44 { 45 int a; 46 int l, r; 47 int tag; 48 tree() 49 { 50 tag = 0; 51 l = 0; 52 r = 0; 53 a = 0; 54 } 55 }node[maxn]; 56 57 void build(int x, int l, int r) 58 { 59 node[x].l = l; 60 node[x].r = r; 61 if (l == r) 62 { 63 node[x].a = a[l]; 64 return; 65 } 66 int mid = (l + r) >> 1; 67 build(lc(x), l, mid); 68 build(rc(x), mid + 1, r); 69 node[x].a = min(node[lc(x)].a, node[rc(x)].a); 70 } 71 72 inline void push_down(int x) 73 { 74 node[lc(x)].tag += node[x].tag; 75 node[lc(x)].a += node[x].tag; 76 node[rc(x)].a += node[x].tag; 77 node[rc(x)].tag += node[x].tag; 78 node[x].tag = 0; 79 } 80 81 inline void update(int left, int right, int x, int k) 82 { 83 if (left <= node[x].l && node[x].r <= right) 84 { 85 node[x].a += k; 86 node[x].tag += k; 87 return; 88 } 89 push_down(x); 90 int mid = (node[x].l + node[x].r) >> 1; 91 if (left <= mid) update(left, right, lc(x), k); 92 if (right > mid) update(left, right, rc(x), k); 93 node[x].a = min(node[lc(x)].a, node[rc(x)].a); 94 } 95 96 int query(int left, int right, int x) 97 { 98 int res = INF; 99 if (left <= node[x].l && node[x].r <= right) return node[x].a; 100 int mid = (node[x].l + node[x].r) >> 1; 101 if (left <= mid) res = min(res, query(left, right, lc(x))); 102 if (right > mid) res = min(res, query(left, right, rc(x))); 103 return res; 104 } 105 106 int main() 107 { 108 ios::sync_with_stdio(0); 109 cin.tie(0); 110 cin >> n >> m; 111 mfor(i, 1, n) 112 { 113 cin >> a[i]; 114 } 115 build(1, 1, n); 116 mfor(i, 1, m) 117 { 118 int a, b, c; 119 cin >> a >> b >> c; 120 update(b, c, 1, -a); 121 if (query(1, n, 1) < 0) 122 { 123 cout << -1 << endl; 124 cout << i; 125 return 0; 126 } 127 } 128 cout << 0; 129 }