#include<cstdio>
#include<algorithm>
#define N 3919810
#define int long long
#define lc p<<1
#define rc p<<1|1
using namespace std;
struct Segment_tree{
int l,r,sum,mx,mn;
int val;
}s[N];
int n,m,las;
void pushup(int p){
s[p].sum=s[lc].sum+s[rc].sum;
s[p].val=s[lc].val+s[rc].val;
s[p].mx=max(s[lc].mx,s[rc].mx);
s[p].mn=min(s[lc].mn,s[rc].mn);
}
void build(int p,int l,int r){
s[p].l=l,s[p].r=r;
if(l==r){
int a;
scanf("%lld",&a);
s[p].sum=a*a;
s[p].val=a;
s[p].mx=a;
s[p].mn=a;
return;
}
build(lc,l,(l+r)/2);
build(rc,(l+r)/2+1,r);
pushup(p);
}
void change(int p,int x,int v){
if(s[p].l>x||s[p].r<x)return;
if(s[p].l==x&&s[p].r==x){
s[p].sum=v*v;
s[p].val=v;
s[p].mx=v;
s[p].mn=v;
return;
}
change(lc,x,v);change(rc,x,v);
pushup(p);
}
int query(int p,int l,int r){
if(s[p].l>r||s[p].r<l)return 0;
if(s[p].l>=l&&s[p].r<=r)return s[p].sum;
return query(lc,l,r)+query(rc,l,r);
}
int qsum(int p,int l,int r){
if(s[p].l>r||s[p].r<l)return 0;
if(s[p].l>=l&&s[p].r<=r)return s[p].val;
return qsum(lc,l,r)+qsum(rc,l,r);
}
int qmax(int p,int l,int r){
if(s[p].l>r||s[p].r<l)return -2147483647;
if(s[p].l>=l&&s[p].r<=r)return s[p].mx;
return max(qmax(lc,l,r),qmax(rc,l,r));
}
int qmin(int p,int l,int r){
if(s[p].l>r||s[p].r<l)return 2147483647;
if(s[p].l>=l&&s[p].r<=r)return s[p].mn;
return min(qmin(lc,l,r),qmin(rc,l,r));
}
int calc(int x){return x*(x+1)*(2*x+1);}
bool check(int l,int r,int k){
int rr=qmax(1,l,r),ll=qmin(1,l,r);
int del=(rr-ll)/(r-l),len=r-l;
int fz=len*(len+1)*(2*len+1)*del*del/6;
int ad=len*(len+1)*del*ll;
bool a=query(1,l,r)==ad+fz+(len+1)*ll*ll;
bool b=qsum(1,l,r)*2==(ll+rr)*(r-l+1);
return a&b&(del==k);
}
signed main(){
scanf("%lld%lld",&n,&m);
build(1,1,n);
while(m--){
int op,l,r,k;
scanf("%lld%lld%lld",&op,&l,&r);
l^=las,r^=las;
if(l>r)swap(l,r);
if(op==1)change(1,l,r);
else{
scanf("%lld",&k);
k^=las;
puts((las+=check(l,r,k))?"Yes":"No");
}
}
return 0;
}