为啥莫名 Re 了呀 ,数组什么的应该都开够了呀
#include<cstdio>
#include<ctype.h>
#define int long long
using namespace std;
int a[2000005],b[2000005],n,m;
int min(int a,int b){return a>b?b:a;}
struct Node{
int l,r,minn;
Node *left,*right;
Node()
{
l=r=minn=0;
left=right=NULL;
}
};
Node *built(int l,int r)
{
Node *cur=new Node();
cur->l=l;cur->r=r;
if(l==r)
{
cur->minn=b[l];
return cur;
}
int mid=(l+r)>>1;
cur->left=built(l,mid),cur->right=built(mid+1,r);
cur->minn=min(cur->left->minn,cur->right->minn);
return cur;
}
void modify(int x,int k,Node *cur)
{
if(cur->l==cur->r)
{
cur->minn+=k;
return;
}
int mid=(cur->l+cur->r)>>1;
if(x<=mid)modify(x,k,cur->left);
else modify(x,k,cur->right);
cur->minn=min(cur->left->minn,cur->right->minn);
return;
}
int query(int l,int r,Node *cur)
{
if(l<=cur->l&&cur->r<=r)
return cur->minn;
int mid=(cur->l+cur->r)>>1;
if(r<=mid)return query(l,r,cur->left);
if(l>mid)return query(l,r,cur->right);
return min(query(l,mid,cur->left),query(mid+1,r,cur->right));
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",a+i);
for(int i=1;i<=n+1;i++)
b[i]=a[i]-a[i-1];
Node *Tree=built(1,n+2);
for(int i=1;i<=m;i++)
{
int t;
scanf("%lld",&t);
if(t==1)
{
int l,r,k;scanf("%lld%lld%lld",&l,&r,&k);
modify(l,k,Tree);modify(r+1,-k,Tree);
}
else
{
int l,r;scanf("%lld%lld",&l,&r);
int ans=query(l+1,r,Tree);
if(ans>=0)printf("Yes\n");
else printf("No\n");
}
}
return 0;
}