#include<iostream>
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000000+10;
int n,m;
int a[N],b[N];
int c[N],l[N],r[N];
bool check(int x)
{
//对每次的订单都是从1开始到x,且内容都可以实现更新
for(int i=1;i<=n;i++)
b[i]=a[i]-a[i-1];//构建a的差分数组
//实现对a数组的特定范围都减去c
for(int i=1;i<=x;i++)//对第1~x个订单进行操作
{
b[l[i]]-=c[i];
b[r[i]+1]+=c[i];
}
for(int i=1;i<=n;i++)
{
b[i]+=b[i-1];//将差分数累加,其实是a[i]
if(b[i]<0)//如果a[i]<0相当于教室数不足
return true;
}
return false;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i]; //每天可借的订单数
for(int i=1;i<=m;i++)
//订单数据 ,这里先导入是为了后面使用差分对订单进行判断
cin>>c[i]>>l[i]>>r[i];
//题目是要求找到不符合的订单而且订单具有二段性
//最快的方法是使用二分进行查找
int l=1,r=m+1;//对订单进行遍历
while(l<r)
{
int mid=(l+r)/2;
//判断第1~第mid个订单是否符合题意
//这里是将申请教室小于空闲教室作为答案
//即左边为所符合的答案,使用模版1
if(check(mid)) //当教室不足时为true,r=mid即将该订单舍去,遍历前面的订单
r=mid;
else //当1~mid订单符合时左范围增大,使得查询订单数向后挪
//当所有都符合时l==r==m+1
l=mid+1;
} //结束条件是l==r
if(l==m+1)
cout<<'0'<<endl;
else
cout<<r<<endl;
return 0;
}
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000000+10;
int n,m;
int a[N],b[N];
int c[N],l[N],r[N];
bool check(int x)
{
//对每次的订单都是从1开始到x,且内容都可以实现更新
for(int i=1;i<=n;i++)
b[i]=a[i]-a[i-1];//构建a的差分数组
//实现对a数组的特定范围都减去c
for(int i=1;i<=x;i++)//对第1~x个订单进行操作
{
b[l[i]]-=c[i];
b[r[i]+1]+=c[i];
}
for(int i=1;i<=n;i++)
{
b[i]+=b[i-1];//将差分数累加,其实是a[i]
if(b[i]<0)//如果a[i]<0相当于教室数不足
return true;
}
return false;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i]; //每天可借的订单数
for(int i=1;i<=m;i++)
//订单数据 ,这里先导入是为了后面使用差分对订单进行判断
cin>>c[i]>>l[i]>>r[i];
//题目是要求找到不符合的订单而且订单具有二段性
//最快的方法是使用二分进行查找
int l=1,r=m+1;//对订单进行遍历
while(l<r)
{
int mid=(l+r)/2;
//判断第1~第mid个订单是否符合题意
//这里是将申请教室小于空闲教室作为答案
//即左边为所符合的答案,使用模版1
if(check(mid)) //当教室不足时为true,r=mid即将该订单舍去,遍历前面的订单
r=mid;
else //当1~mid订单符合时左范围增大,使得查询订单数向后挪
//当所有都符合时l==r==m+1
l=mid+1;
} //结束条件是l==r
if(l==m+1)
cout<<'0'<<endl;
else
cout<<r<<endl;
return 0;
}