以时间为下标,1~n,每个位置的值初始化为当天可以出租的教室数量,按顺序处理订单,对于每个订单d s t,在区间[s,t]减去d,如果出现了区间最小值出现了小于零的情况,说明不符合,直接输出然后return 0,否则处理完全部订单之后输出0即可。
#include <cctype>
#include <cfloat>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <deque>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <istream>
#include <iterator>
#include <list>
#include <map>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#define ll long long
#define pll pair<long long, long long>
#define P pair<int, int>
#define PP pair<P, P>
#define eps 1e-10
#define PI 3.1415926535898
#define It set<node>::iterator
using namespace std;
const int maxn=1e6+10;
inline ll Read() {
char ch=getchar();
ll num=0;
while (!isdigit(ch)) ch=getchar();
while (isdigit(ch)) {
num=(num<<3)+(num<<1)+ch-'0';
ch=getchar();
}
return num;
}
struct node {
int Left,Right;
ll lazy,val;
}NODE[maxn<<2];
void PushUp(int idx) {
NODE[idx].val=min(NODE[idx<<1].val,NODE[idx<<1|1].val);
}
void PushDown(int idx) {
if (NODE[idx].lazy) {
NODE[idx<<1].val-=NODE[idx].lazy;
NODE[idx<<1|1].val-=NODE[idx].lazy;
NODE[idx<<1].lazy+=NODE[idx].lazy;
NODE[idx<<1|1].lazy+=NODE[idx].lazy;
NODE[idx].lazy=0;
}
}
void build(int l, int r, int idx) {
NODE[idx]={l,r,0,0};
if (l==r) {
NODE[idx].val=Read();
return;
}
int m=(l+r)>>1;
build(l,m,idx<<1);
build(m+1,r,idx<<1|1);
PushUp(idx);
}
ll sum[maxn];
void Updata(int l, int r, ll sum, int idx) {
if (NODE[idx].Left==l&&NODE[idx].Right==r) {
NODE[idx].val-=sum;
NODE[idx].lazy+=sum;
return;
}
PushDown(idx);
int m=(NODE[idx].Left+NODE[idx].Right)>>1;
if (r<=m) Updata(l,r,sum,idx<<1);
else if (l>m) Updata(l,r,sum,idx<<1|1);
else {
Updata(l,m,sum,idx<<1);
Updata(m+1,r,sum,idx<<1|1);
}
PushUp(idx);
}
int main() {
int n=Read(),m=Read();
build(1,n,1);
for (int i=1; i<=m; ++i) {
ll sum=Read();
int l=Read();
int r=Read();
Updata(l,r,sum,1);
if (NODE[1].val<0) {
printf("-1\n");
printf("%d\n",i);
return 0;
}
}
printf("0");
return 0;
}


京公网安备 11010502036488号