题目:http://www.luogu.org/problem/show?pid=1083#
分析:
法一:二分+前缀和
法二:线段树
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Tmax=1000005;
int n,m;
long long int sum[Tmax],tsum[Tmax],d[Tmax],s[Tmax],j[Tmax];
int check(int num)
{
int i;
long long int tmp=0;
memset(tsum,0,sizeof(tsum));
for(i=1;i<=num;i++)
{
tsum[s[i]]-=d[i];
tsum[j[i]+1]+=d[i];
}
for(i=1;i<=n;i++)
{
tmp+=tsum[i];
if(tmp+sum[i]<0) return 0;
}
return 1;
}
void work()
{
int l=1,r=m,mid;
while(l<r)
{
mid=(l+r)/2;
if(check(mid)==1)
l=mid+1;
else r=mid;
}
printf("-1\n%d",r);
return;
}
int main()
{
int i;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
scanf("%lld",&sum[i]);
for(i=1;i<=m;i++)
scanf("%lld %lld %lld",&d[i],&s[i],&j[i]);
if(check(m)==1) printf("0");
else work();
return 0;
}