标签:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define ll long long #define N 4001000 #define mid (l+r>>1) #define lc (k<<1) #define rc (k<<1|1) ll a[N],tag[N]; ll n,m,b; inline ll read(){ register ll x=0,f=1; register char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘) f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } inline void ins(int k,int l,int r,int i,int val){ if(l==r){a[k]=val;return;} if(i<=mid) ins(lc,l,mid,i,val); else ins(rc,mid+1,r,i,val); a[k]=min(a[lc],a[rc]);//维护区 } void pushdown(int k,int l,int r){//维护区 if(!tag[k]) return ; a[lc]+=tag[k]; a[rc]+=tag[k]; tag[lc]+=tag[k];tag[rc]+=tag[k];tag[k]=0; } void add(int k,int l,int r,int x,int y,int val){ if(l==x&&r==y){ tag[k]+=val;a[k]+=val;return ;//维护区 } pushdown(k,l,r); if(y<=mid) add(lc,l,mid,x,y,val); else if(x>mid) add(rc,mid+1,r,x,y,val); else add(lc,l,mid,x,mid,val),add(rc,mid+1,r,mid+1,y,val); a[k]=min(a[lc],a[rc]);//维护区 } int main(){ n=read(),m=read(); for(int i=1;i<=(int)n;i++) b=read(),ins(1,1,n,i,b);//建树 int flag=0; for(int i=1;i<=(int)m;i++){ ll val=read(),l=read(),r=read(); add(1,1,n,l,r,-val); if(a[1]<0){//关键判断 printf("-1\n%d\n",i);flag=1;return 0; } } if(!flag) printf("0\n"); return 0; }
标签:
原文地址:http://www.cnblogs.com/shenben/p/5579811.html