#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node
{
int m,op,lazy,n;
};
node dis[4000005];
int a[100005];
void push(int p)
{
int lazy=dis[p].lazy;
dis[p].lazy=0;
dis[p<<1].m+=lazy;
dis[p<<1|1].m+=lazy;
dis[p<<1].n+=lazy;
dis[p<<1|1].n+=lazy;
dis[p<<1].lazy+=lazy;
dis[p<<1|1].lazy+=lazy;
dis[p].m=max(dis[p<<1].m,dis[p<<1|1].m);
dis[p].n=min(dis[p<<1].n,dis[p<<1|1].n);
}
void build(int l,int r,int p)
{
if(l==r)
{
dis[p].m=dis[p].n=a[l];
dis[p].op=1;
return;
}
int mid=(l+r)>>1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
dis[p].m=max(dis[p<<1].m,dis[p<<1|1].m);
dis[p].n=min(dis[p<<1].n,dis[p<<1|1].n);
if(dis[p<<1].op==0||dis[p<<1|1].op==0||dis[p<<1|1].m<dis[p<<1].m||dis[p<<1|1].n<dis[p<<1].m)
dis[p].op=0;
else
dis[p].op=1;
}
void update(int l,int r,int ansl,int ansr,int x,int p)
{
if(ansl<=l && ansr>=r)
{
dis[p].m+=x;
dis[p].n+=x;
dis[p].lazy+=x;
return;
}
int mid=(l+r)>>1;
if(ansl<=mid)
update(l,mid,ansl,ansr,x,p<<1);
if(ansr>mid)
update(mid+1,r,ansl,ansr,x,p<<1|1);
dis[p].m=max(dis[p<<1].m,dis[p<<1|1].m);
dis[p].n=min(dis[p<<1].n,dis[p<<1|1].n);
if(dis[p<<1].op==0||dis[p<<1|1].op==0||dis[p<<1|1].m<dis[p<<1].m||dis[p<<1|1].n<dis[p<<1].m)
dis[p].op=0;
else
dis[p].op=1;
}
int ans(int l,int r,int ansl,int ansr,int p)
{
if(ansl<=l && ansr>=r)
{
return dis[p].op;
}
if(dis[p].lazy)
{
push(p);
}
int mid=(l+r)>>1,t=1;
if(ansl<=mid)
t=min(ans(l,mid,ansl,ansr,p<<1),t);
if(ansr>mid)
t=min(ans(mid+1,r,ansl,ansr,p<<1|1),t);
return t;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=4*n;i++)
dis[i].n=1e9;
build(1,n,1);
while(k--)
{
int opt,l,r,x;
cin>>opt>>l>>r;
l=min(l,r);
r=max(l,r);
if(opt==1)
{
cin>>x;
update(1,n,l,min(r,n),x,1);
}
else
{
if(ans(1,n,l,min(r,n),1))
cout<<"Yes"<<"\n";
else
cout<<"No"<<"\n";
}
}
}