#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000005
#define int long long
#define mid ((l+r)>>1)
int a[MAXN],n,k;
struct XDS{
int l,r,minn,maxn,lzt;
bool anc;
}xds[MAXN<<2],bz;
inline void XDS_push_down(int x){
xds[x<<1].lzt+=xds[x].lzt;
xds[x<<1].minn+=xds[x].lzt;
xds[x<<1].maxn+=xds[x].lzt;
xds[(x<<1)+1].lzt+=xds[x].lzt;
xds[(x<<1)+1].minn+=xds[x].lzt;
xds[(x<<1)+1].maxn+=xds[x].lzt;
xds[x].lzt=0;
return;
}
inline void XDS_merge(int x){
if(xds[x<<1].anc&&xds[(x<<1)+1].anc&&xds[x<<1].maxn<=xds[(x<<1)+1].minn) xds[x].anc=1;
else xds[x].anc=0;
xds[x].minn=xds[x<<1].minn;
xds[x].maxn=xds[(x<<1)+1].maxn;
return;
}
inline void XDS_make(int x,int l,int r){
xds[x].l=l;
xds[x].r=r;
if(xds[x].l==xds[x].r){
xds[x].maxn=xds[x].minn=a[l];
xds[x].anc=1;
return;
}
XDS_make(x<<1,l,mid);
XDS_make((x<<1)+1,mid+1,r);
XDS_merge(x);
}
inline void XDS_add(int x,int l,int r,int z){
if(xds[x].l>=l&&xds[x].r<=r) xds[x].lzt+=z,xds[x].minn+=z,xds[x].maxn+=z;
else if(xds[x].r<l||xds[x].l>r) return;
else{
XDS_push_down(x);
XDS_add(x<<1,l,r,z);
XDS_add((x<<1)+1,l,r,z);
XDS_merge(x);
}
return;
}
inline XDS XDS_search(int x,int l,int r){
XDS node1=bz,node2=bz;
if(xds[x].l>=l&&xds[x].r<=r) return xds[x];
else if(xds[x].r<l||xds[x].l>r) {node1.r=node1.l=-1;return node1;}
else{
node1=XDS_search(x<<1,l,r);
node2=XDS_search((x<<1)+1,l,r);
if(node1.l==-1) return node2;
else if(node2.l==-1) return node1;
else {
if(node1.anc&&node2.anc&&node1.maxn<=node2.minn) node1.anc=1;
else node1.anc=0;
node1.r=node2.r,node1.maxn=node2.maxn;
return node1;
}
}
return node1;
}
signed main(){
bz.l=bz.r=bz.anc=bz.maxn=bz.minn=0;
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
XDS_make(1,1,n);
while(k--){
int opt,l,r;
scanf("%lld%lld%lld",&opt,&l,&r);
if(r>=n+1) r=n;
if(opt==1){
int z;
scanf("%lld",&z);
XDS_add(1,l,r,z);
}
else{
if(XDS_search(1,l,r).anc) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}