1.二分思想,while;
2.前缀和;用change数组储存教室数目的变化
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,d[1000001],s[1000001],t[1000001],rest[1000001],change[1000001],need[1000001];
int check(int x){
int i;
memset(change ,0,sizeof(change));
for(i=1;i<=x;i++){
change[s[i]]+=d[i];
change[t[i]+1]-=d[i];
}
for(i=1;i<=n;i++){
need[i]=need[i-1]+change[i];
if(need[i]>rest[i]) return 0;
}
return 1;
}
int main(){
scanf("%d%d",&n,&m);
int i;
for(i=1;i<=n;i++){
scanf("%d",&rest[i]);
}
for(i=1;i<=m;i++){
scanf("%d%d%d",&d[i],&s[i],&t[i]);
}
int l=1,r=m,mid;
while(l<r){
mid=(l+r)/2;
if(check(mid)) l=mid+1;
else r=mid;
}
if(l==m) printf("0");
else printf("-1\n%d",l);
return 0;
}