思路:二分订单,用差分区间修改,数组名字均是按照题目命名,cf数组是差分
#include<iostream>
#include<cstring>
using namespace std;
int n,r[1000010],m,d[1000010],s[1000010],t[1000010],cf[1000010];
bool f(int x){
for(int i=1;i<=n;i++){
cf[i]=r[i]-r[i-1];
}
for(int i=1;i<=x;i++){
cf[s[i]]-=d[i],cf[t[i]+1]+=d[i];
}
for(int i=1;i<=n;i++){
cf[i]+=cf[i-1];
if(cf[i]<0){
return false;
}
}
return true;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>r[i];
}
for(int i=1;i<=m;i++){
cin>>d[i]>>s[i]>>t[i];
}
int l=1,ri=m+1,mid;
while(l<ri){
mid=(l+ri)/2;
if(f(mid)){
l=mid+1;
}else{
ri=mid;
}
}
if(l==n+1){
cout<<"0"<<endl;
}else{
cout<<"-1"<<endl<<l<<endl;
}
return 0;
}