)
找了好久看不出来有什么问题···
所有代码:
#include <bits/stdc++.h>
using namespace std;
#define N 1000005
#define re(x) x=read()
#define lc (p<<1)
#define rc (p<<1)|1
struct Tr{
int l,r,num;
}t[N*4];
inline int read()
{
int num=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9'){num=(num<<1)+(num<<3)+c-'0';c=getchar();}
return f*num;
}
int n,k,a[N],b[N];
void pushup(int p)
{
t[p].num=min(t[lc].num,t[rc].num);
}
void updat(int p,int t,int x)
{
if(t[p].l==t[p].r&&t[p].l==t)
{
t[p].num+=x;
return;
}
int mid=(t[p].l+t[p].r)>>1;
if(mid<=t) updat(lc,t,x);
else updat(rc,t,x);
pushup(p);
}
void build(int p,int l,int r)
{
t[p].l=l,t[p].r=r;
if(l==r)
{
t[p].num=b[l];
return;
}
int mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
pushup(p);
}
int ask(int p,int l,int r)
{
if(t[p].l<=l&&t[p].r>=r)
return t[p].num;
int mid=(l+r)>>1;
int min1=0x7f7f7f7f,min2=0x7f7f7f7f;
if(mid>=r) min1=ask(lc,l,r);
if(mid+1<=l) min2=ask(rc,l,r);
return min(min1,min2);
}
int main()
{
re(n);re(k);
for(int i=1;i<=n;i++)
re(a[i]);
for(int i=1;i<=n;i++)
b[i]=a[i]-a[i-1];
// for(int i=1;i<=n;i++)
// cout<<b[i]<<' ';
build(1,1,n);
for(int i=1;i<=k;i++)
{
int op,l,r,x;
re(op),re(l),re(r);
if(r==n+1) r=n;
if(op==1)
{
re(x);
//b[l]+=x,b[r+1]-=x
updat(1,l,x);
updat(1,r+1,-x);
}
else
if(ask(1,l,r)<0)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
谢谢大佬orz