#include<bits/stdc++.h>
using namespace std;
const int N=5e6+5,p=100000007;
int x,y,a[N],n,m,op,h;
struct node{
int l,r,max,min;
long long sum,sum2;
}t[N<<2];
void pushup(int u){
t[u].sum=t[u<<1].sum+t[u<<1|1].sum;
t[u].sum2=t[u<<1].sum2+t[u<<1|1].sum2;
t[u].max=max(t[u<<1].max,t[u<<1|1].max);
t[u].min=min(t[u<<1].min,t[u<<1|1].min);
}
long long f(int kkk)
{
if(kkk==0)return 1;
long long q=f(kkk/2)%p;
q=(q*q)%p;
if(kkk%2==1)q=(q*2)%p;
return q;
}
void build(int u,int l,int r){
t[u].l=l,t[u].r=r;
if(l==r){
t[u].sum=a[l];
t[u].max=a[l];
t[u].min=a[l];
t[u].sum2=f(a[l])%p;
return;
}
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void update(int u,int x,int y){
if(t[u].l==t[u].r){
t[u].sum=y;
t[u].max=y;
t[u].min=y;
t[u].sum2=f(y)%p;
return;
}
int mid=t[u].l+t[u].r>>1;
if(x<=mid)update(u<<1,x,y);
else update(u<<1|1,x,y);
pushup(u);
}
node query(int u,int l,int r){
if(l<=t[u].l&&t[u].r<=r){
return t[u];
}
int mid=t[u].l+t[u].r>>1;
node ans;
ans.sum=0;
ans.max=-1321225477;
ans.min=1321225477;
if(l<=mid){
node t1=query(u<<1,l,mid);
ans.sum+=t1.sum;
ans.sum2+=t1.sum2%p;
ans.min=min(t1.min,ans.min);
ans.max=max(t1.max,ans.max);
}
if(r>mid){
node t1=query(u<<1|1,mid+1,r);
ans.sum+=t1.sum;
ans.sum2+=t1.sum2%p;
ans.min=min(t1.min,ans.min);
ans.max=max(t1.max,ans.max);
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d",&op);
if(op==1){
int x,y;
scanf("%d%d",&x,&y);
x^=h;
y^=h;
update(1,x,y);
}else{
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
l^=h;
r^=h;
k^=h;
node t1=query(1,l,r);
long long sum1=0;
sum1=abs(f(t1.min)-f(t1.max)*2);
if((t1.max+t1.min)*(r-l+1)/2==t1.sum&&(r-l)*k==t1.max-t1.min&&sum1==t1.sum2){
printf("Yes\n");
h++;
}else{
printf("No\n");
}
}
}
return 0;
}