#define int long long
using namespace std;
int n,T;
int a[10000010],laz[10000010];
struct node {
int l,r,lw,rw;
bool f;
} e[10000010];
void renewans(node &x,node y,node z) {
x.lw=y.lw;
x.rw=z.rw;
if(y.f&&z.f&&y.rw<=z.lw) {
x.f=1;
} else {
x.f=0;
}
return;
}
void merge(int i) {
e[i].lw=e[i*2].lw;
e[i].rw=e[i*2+1].rw;
if(e[i*2].rw<=e[i*2+1].lw&&e[i*2].f&&e[i*2+1].f) {
e[i].f=1;
} else {
e[i].f=0;
}
return;
}
void pushup(int i,int w) {
e[i].lw+=w;
e[i].rw+=w;
laz[i]+=w;
return;
}
void pushdown(int i) {
if(e[i].l==e[i].r) {
return;
}
pushup(i*2,laz[i]);
pushup(i*2+1,laz[i]);
laz[i]=0;
return;
}
void build(int i,int l,int r) {
e[i].l=l;
e[i].r=r;
if(l==r) {
e[i].lw=e[i].rw=a[l];
e[i].f=1;
return;
}
build(i*2,l,(l+r)/2);
build(i*2+1,(l+r)/2+1,r);
merge(i);
return;
}
void update(int i,int l,int r,int w) {
if(e[i].l>=l&&e[i].r<=r) {
pushup(i,w);
return;
}
pushdown(i);
int mid=(e[i].l+e[i].r)/2;
if(mid>=l) {
update(i*2,l,r,w);
}
if(mid<r) {
update(i*2+1,l,r,w);
}
merge(i);
return;
}
node query(int i,int l,int r) {
if(e[i].l>=l&&e[i].r<=r) {
return e[i];
}
pushdown(i);
node ans,a1,a2;
int mid=(e[i].l+e[i].r)/2;
if(mid>=r) {
return query(i*2,l,r);
} else if(mid<l) {
return query(i*2+1,l,r);
} else {
a1=query(i*2,l,mid);
a2=query(i*2+1,mid+1,r);
renewans(ans,a1,a2);
}
return ans;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(),cout.tie();
cin>>n>>T;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
build(1,1,n);
while(T--) {
int op,l,r,w;
cin>>op;
if(op==1) {
cin>>l>>r>>w;
update(1,l,r,w);
} else {
cin>>l>>r;
cout<<(query(1,l,r).f?"Yes\n":"No\n");
}
}
return 0;
}```