借教室 差分 二分
#include<iostream>
using namespace std;
#define ll long long
int n,m;
ll b[1000005];
ll a[1000005];
ll sum[1000005];
ll aa[1000005];
struct{
int days;
int beg;
int end;
}tic[1000005];
bool get(int s)
{
for(int i=1;i<=n;i++)
{
aa[i]=a[i];
}
for(int i=1;i<=s;i++)
{
aa[tic[i].beg]-=tic[i].days;
aa[tic[i].end+1]+=tic[i].days;
}
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+aa[i];
if(sum[i]<0)
{
return 0;
}
}
return 1;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%lld",&b[i]);
a[i]=b[i]-b[i-1];
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&tic[i].days,&tic[i].beg,&tic[i].end);
}
int l=1;
int r=m+1;
int mid;
bool ok;
while(l<r)
{
mid=(l+r)/2;
ok=get(mid);
if(ok)
{
l=mid+1;
}else {
r=mid;
}
}
if(l>m)
{
cout<<0;
}else if(!get(l))
{
cout<<-1<<endl;
cout<<l;
}else {
cout<<0;
}
return 0;
}