二分+差分即可; AC代码+注释如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
struct node{//结构体
int d,s,t;
}a[N];
int n,m,b[N],c[N];
bool check(int x){//二分搜索
for(int i=1;i<=n;i++)c[i]=0;//初始化
for(int i=1;i<=x;i++){//差分
c[a[i].s]+=a[i].d;
c[a[i].t+1]-=a[i].d;
}
int t=0;
for(int i=1;i<=n;i++){
t+=c[i];//差分前缀和
if(b[i]-t<0)return true;//判断是否满足矛盾
}
return false;
}
int main(){
cin>>n>>m;//输入
for(int i=1;i<=n;i++)cin>>b[i];
for(int i=1;i<=m;i++)cin>>a[i].d>>a[i].s>>a[i].t;
int l=1,r=m,ans=0;
while(l<=r){//二分
int mid=(l+r)>>1;
if(check(mid))ans=mid,r=mid-1;
else l=mid+1;
}
if(ans)cout<<-1<<'\n'<<ans<<'\n';
else cout<<ans<<'\n';//输出
}