其实一开始我是想到用线段树处理的,但仔细一想发现不好处理,所以另寻它路,突然想到了二分的方法,再运用差分优化统计,就过了;
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int n,m;
int num[N];
int s[N],t[N],d[N];
int now[N];
bool judge(int x)//差分
{
memset(now,0,sizeof(now));
for(int i=1;i<=x;++i)
{
now[s[i]]+=d[i];
now[t[i]+1]-=d[i];
}
if(now[1]>num[1])
return false;
for(int i=2;i<=n;++i)
{
now[i]+=now[i-1];
if(now[i]>num[i])
return false;
}
return true;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&num[i]);
for(int i=1;i<=m;++i)
scanf("%d%d%d",&d[i],&s[i],&t[i]);
int l=1,r=m;
int ans=-1;
while(l<r)//二分
{
int mid=(l+r)/2;
if(judge(mid)==false) ans=mid,r=mid;
else l=mid+1;
}
if(ans==-1)
printf("0");
else
{
printf("-1\n");
printf("%d",ans);
}
return 0;
}