| 记录编号 | 200516 | 评测结果 | AAAAAAAAAAAAAAAAAAAA | 
    
        | 题目名称 | 1266.[NOIP 2012]借教室 | 最终得分 | 100 | 
    
        | 用户昵称 |  thomount | 是否通过 | 通过 | 
    
        | 代码语言 | C++ | 运行时间 | 1.796 s | 
    
        | 提交时间 | 2015-10-28 21:30:58 | 内存使用 | 32.89 MiB | 
    
    
    
    		显示代码纯文本
		
		#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int read() {
	char ch = getchar();
	while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
	int ans = 0, flag = 1;
	if (ch == '-') flag = -1, ch = getchar();
	while (ch >= '0' && ch <= '9') ans = ans * 10 + ch - '0', ch = getchar();
	return ans * flag;
}
const int N = 1000010;
struct point {
	int x, w, s;
	point(int s = 0, int w = 0, int x = 0): x(x), w(w), s(s) {}
} p[2*N];
bool operator < (point a, point b) {
	return (a.w < b.w);
}
int d[N], f[N], a[N];
int main() {
	freopen("classrooms.in", "r", stdin);
	freopen("classrooms.out", "w", stdout);
	int n = read(), m = read();
	
	for (int i = 1; i <= n; i++) a[i] = read();
	for (int i = 1; i <= m; i++) {
		int D = read(), L = read(), R = read();
		d[i] = D;
		p[2*i-1] = point(D, L, i);
		p[2*i] = point(-D, R+1, i);
	}
	
	sort(p+1, p+2*m+1);
	int st = 1, bad = m+1;
	memset(f, 0, sizeof(f));
	long long S = 0;
	for (int i = 1; i <= n; i++) {
		while (st <= 2*m && p[st].w == i) {
			if (p[st].x <= bad) {
				S += p[st].s;
				if (p[st].s < 0) f[p[st].x] = 0; else f[p[st].x] = 1;
			}
			st++;
		}
		if (S > a[i]) {
			while (bad > 1 && S > a[i]) {
				if (f[bad-1]) {
					S -= d[bad-1];
					f[bad-1] = 0;
				}
				bad--;
			}
		}
		if (bad == 1) break;
	}
	
	if (bad == m+1) printf("0\n"); else printf("-1\n%d\n", bad);
	return 0;
}