捆绑测试 #6 #7 wa的比较集中,萌新实在无从下手调试
#include<cstdio>
#define maxn 1000100
using namespace std;
int a[maxn];
struct node{
int l,r,lw,rw,v,add;
}t[maxn<<2];
void check(int u){
t[u].lw=t[u<<1].lw,t[u].rw=t[(u<<1)+1].rw;
if(t[u<<1].rw<=t[(u<<1)+1].lw&&t[u<<1].v&&t[(u<<1)+1].v)t[u].v=1;
else t[u].v=0;
}
void build(int u,int l,int r){
t[u].l=l,t[u].r=r;
if(l==r){
t[u].lw=t[u].rw=a[l];
t[u].v=1;
return;
}
int mid=l+r>>1;
build(u<<1,l,mid);
build((u<<1)+1,mid+1,r);
check(u);
}
void spread(int u){
if(t[u].add){
t[u<<1].lw+=t[u].add,t[u<<1].rw+=t[u].add;
t[(u<<1)+1].lw+=t[u].add,t[(u<<1)+1].rw+=t[u].add;
t[u<<1].add+=t[u].add;
t[(u<<1)+1].add+=t[u].add;
t[u].add=0;
}
}
void change(int u,int x,int y,int z){
if(x<=t[u].l&&t[u].r<=y){
t[u].lw+=z,t[u].rw+=z;
t[u].add+=z;
return;
}
spread(u);
int mid=t[u].l+t[u].r>>1;
if(x<=mid)change(u<<1,x,y,z);
if(y>mid)change((u<<1)+1,x,y,z);
check(u);
}
node ask(int u,int x,int y){
node ans,ans1,ans2;
if(x<=t[u].l&&t[u].r<=y)return t[u];
spread(u);
int mid=t[u].l+t[u].r>>1;
if(mid<x)return ask((u<<1)+1,x,y);
else if(mid>=y)return ask(u<<1,x,y);
else {
ans1=ask(u<<1,x,mid);
ans2=ask((u<<1)+1,mid+1,y);
if(ans1.rw<=ans2.lw&&ans1.v&&ans2.v)ans.v=1;
else ans.v=0;
}
return ans;
}
int main(){
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=k;i++){
int x,y,z,w;
node s;
scanf("%d%d%d",&x,&y,&z);
if(x==1){
scanf("%d",&w);
change(1,y,z,w);
}
else{
s=ask(1,y,z);
if(s.v)printf("Yes\n");
else printf("No\n");
}
}
}