RT
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[1000005],op,x,y,k;
struct tree{
int tree[4000005][3],d[4000005];
void build(int id,int l,int r){
if(l==r){
tree[id][0] = tree[id][1] = tree[id][2] = 1;
return;
}
int mid = (l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
tree[id][0] = (tree[id*2][0]==mid-l+1&&d[mid+1]>=0?tree[id*2][0]+tree[id*2+1][0]:tree[id*2][0]);
tree[id][1] = (tree[id*2+1][1]==r-mid&&d[mid+1]>=0?tree[id*2][1]+tree[id*2+1][1]:tree[id*2+1][1]);
tree[id][2] = max(max(tree[id*2][2],tree[id*2+1][2]),max(tree[id][0],tree[id][1]));
if(d[mid+1]>=0)tree[id][2] = max(tree[id][2],tree[id*2][1]+tree[id*2+1][0]);
return;
}
void update(int id,int x,int l,int r,int p){
if(l==r&&l==x){
d[x]+=p;
tree[id][0] = tree[id][1] = tree[id][2] = 1;
return;
}
int mid = (l+r)/2;
if(mid>=x)update(id*2,x,l,mid,p);
if(mid<x)update(id*2+1,x,mid+1,r,p);
tree[id][0] = (tree[id*2][0]==mid-l+1&&d[mid+1]>=0?tree[id*2][0]+tree[id*2+1][0]:tree[id*2][0]);
tree[id][1] = (tree[id*2+1][1]==r-mid&&d[mid+1]>=0?tree[id*2][1]+tree[id*2+1][1]:tree[id*2+1][1]);
tree[id][2] = max(max(tree[id*2][2],tree[id*2+1][2]),max(tree[id][0],tree[id][1]));
if(d[mid+1]>=0)tree[id][2] = max(tree[id][2],tree[id*2][1]+tree[id*2+1][0]);
return;
}
int query(int id,int idl,int idr,int l,int r,int op){
if(idl>=l&&idr<=r)return tree[id][op];
int mid = (idl+idr)/2,ans = 0;
if(op==0){
if(mid>=l){
ans = query(id*2,idl,mid,l,r,0);
if(mid<r&&d[mid+1]>=0&&ans==mid-max(idl,l)+1)ans+=query(id*2+1,mid+1,idr,l,r,0);
}
else ans = query(id*2+1,mid+1,idr,l,r,0);
}
if(op==1){
if(mid<r){
ans = query(id*2+1,mid+1,idr,l,r,1);
if(mid>=l&&d[mid+1]>=0&&ans==min(idr,r)-mid)ans+=query(id*2,idl,mid,l,r,1);
}
else ans = query(id*2,idl,mid,l,r,1);
}
if(op==2){
if(mid<r)ans = query(id*2+1,mid+1,idr,l,r,2);
if(mid>=l)ans = max(ans,query(id*2,idl,mid,l,r,2));
if(mid<r&&mid>=l&&d[mid+1]>=0)ans = max(ans,query(id*2,idl,mid,l,r,1)+query(id*2+1,mid+1,idr,l,r,0));
}
return ans;
}
}tr;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for(int i = 1;i<=n;i++)cin >> a[i];
a[0] = a[1];
for(int i = 1;i<=n;i++)tr.d[i] = a[i]-a[i-1];
tr.build(1,1,n);
while(m--){
cin >> op >> x >> y;
if(y==n+1)y--;
if(op==1){
cin >> k;
tr.update(1,x,1,n,k);
if(y!=n)tr.update(1,y+1,1,n,-k);
}
else{
if(x==y)cout << "Yes\n";
else cout << (tr.query(1,1,n,x,y,2)==y-x+1?"Yes":"No") << "\n";
}
}
return 0;
}