借教室

链接
二分加差分
注意:求的是第一个不满足的订单,在l或r的基础上++
//具有单调性,二分
//区间操作最后求值,差分

#include
using namespace std;

const int N=1e6+10; 
ll n,m,a[N],d[N],s[N],t[N],diff[N],sum[N];
bool check(int mid){              
	memset(diff,0,sizeof(diff));  //记得初始化 
	memset(sum,0,sizeof(sum));
	for(int i=1;i<=mid;i++){
		diff[s[i]]+=d[i];        
		diff[t[i]+1]-=d[i];
	}
	for(int i=1;i<=n;i++){
		sum[i]=sum[i-1]+diff[i];
		if(sum[i]>a[i]) return false;
	}
	return true;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&d[i],&s[i],&t[i]);
	}
	if(check(m)) printf("0\n");  //特判 
	else{
		int l=1,r=m;
		while(l>1;
			if(check(mid)) l=mid;
			else r=mid-1;
		}
		printf("-1\n%d\n",l+1);
	}
}

你可能感兴趣的:(双指针,二分)