#include<iostream>
using namespace std;
#define ll long long
int n,m;
ll b[1000005];
ll a[1000005]; //记录差分后的数组
ll sum[1000005]; //记录数据处理后
ll aa[1000005]; //copy 数组a,避免每次询问改变数组a
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) // 【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;
}
借教室 差分 二分
猜你喜欢
转载自blog.csdn.net/weixin_45448563/article/details/113733418
今日推荐
周排行