#include using namespace std; const int N = 1000010; #define int long long #define endl "\n" int n, m; // 天数和订单的数量 int r[N]; // 第i天学校有r[i]个教室可借用 int d[N], s[N], t[N]; // 借的教室数目、从第s天借到t天 int cf[N]; // 差分数组 bool check(int x) { // 判断能不能通过x个人 memset(cf, 0, sizeof cf); // 每次判断都要先初始化差分数组 int sum = 0; // 记录需要借的教室数 // 构建差分数组 for (int i = 1; i <= x; i++) { // 枚举范围内所有订单 cf[s[i]] += d[i]; // 第i个订单,因为只会对在s~l之间要借用教室的人产生影响,所以可以差分 cf[t[i] + 1] -= d[i]; // 差分,注意:是t[i]+1,因为要包含t[i]这个点 } // 还原原数组 for (int i = 1; i <= n; i++) { // 枚举每一天 sum += cf[i]; // 因为cf是差分数组,所以sum就是在第i天的借教室的总数 if (sum > r[i]) return false; // 不可行,如果要借的教室多于空的教室 } return true; // 可行 } signed main() { cin >> n >> m; // n:天数,m:订单数量 for (int i = 1; i <= n; i++) cin >> r[i]; // 第i天可以租借的教室数量 for (int i = 1; i <= m; i++) cin >> d[i] >> s[i] >> t[i]; // 借多少个,从哪天借到哪天 // 利用差分整体检查一遍,如果所有订单都能通过,则输出0 if (check(m)) { // 如果全部满足 cout << 0 << endl; // 输出0 exit(0); // 直接结束程序 } int l = 1, r = m; // 二分左右区间 while (l < r) { int mid = l + r >> 1; if (check(mid)) // 如果可行 l = mid + 1; // 增多满足人数 else // 否则 r = mid; // 减少满足人数 } cout << "-1" << endl << l; // 输出-1和需要修改的人 }