蒟蒻剛學了線段樹的最最最最最嘴醉罪咀基本的東西,看什麼題都想用線段樹c++
若是不會線段樹請點這裏spa
題目中說的是求第一個不知足的申請人code
咱們能夠把借教室的操做當作線段樹的區間修改,把要借的教室數量$d$當作修改的值的相反數,而後咱們記錄一下區間的最小值就好了,若是進行區間修改操做後,最小值已經小於0就能夠輸出了htm
#prag\ ma GCC optimize("Ofast")//請忽略這裏 #include<bits/stdc++.h> using namespace std; #define int long long int inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * f; } const int N=1000005; int n,m,a[N]; int minn[N*4],lazy[N*4]; void pushup(int root) { int lson=root<<1; int rson=root<<1|1; minn[root]=min(minn[lson],minn[rson]); } void build(int root,int l,int r) {//建樹 int lson=root<<1; int rson=root<<1|1; if(l==r) { minn[root]=a[l]; return ; } int mid=(l+r)/2; build(lson,l,mid); build(rson,mid+1,r); pushup(root); } void pushdown(int root) {//下放懶標記 int lson=root<<1; int rson=root<<1|1; if(lazy[root]) { minn[lson]+=lazy[root]; minn[rson]+=lazy[root]; lazy[lson]+=lazy[root]; lazy[rson]+=lazy[root]; lazy[root]=0;//懶標記必定要清空啊! } } void update(int root,int l,int r,int x,int y,int v) { int lson=root<<1; int rson=root<<1|1; if(x<=l&&r<=y) { minn[root]+=v; lazy[root]+=v; return ; } int mid=(l+r)>>1; pushdown(root); if(x<=mid) update(lson,l,mid,x,y,v); if(y>mid) update(rson,mid+1,r,x,y,v); pushup(root); } signed main() { n=read(); m=read(); for(int i=1; i<=n; ++i) a[i]=read(); build(1,1,n); for(int i=1; i<=m; ++i) { int d,s,t; cin>>d>>s>>t; update(1,1,n,s,t,-d); if(minn[1]<0) {//不能知足請求 printf("-1\n%d",i); return 0; } } cout<<0; return 0; }