#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#include<math.h>
#include<set>
#include<vector>
#include<map>
#include<utility>
#include<iomanip>
#include<iterator>
#define N 600009
#define INF 0x3f3f3f3f
#define mod 998244353
#define c continue
using namespace std;
typedef long long ll;
typedef long double ldb;
typedef pair<int,int> pii;
int n,m,cnt,lst;
int a[N*6],pr[N*6],nxt[N*6];
map<int,int> mp;
set<int> s[N*2];
struct node{
int l,r,mx,mn,gcd,pre;
}t[N*6];
inline int g(int u,int v){
return v?g(v,u%v):u;
}
inline node pushup(node x,node y){
return {x.l,y.r,max(x.mx,y.mx),min(x.mn,y.mn),g(x.gcd,g(abs(a[y.l]-a[x.r]),y.gcd)),max(x.pre,y.pre)};
}
void build(int p,int l,int r){
t[p].l=l,t[p].r=r;
if(l==r){t[p]={l,r,a[l],a[l],0,pr[l]};return;}
int mid=(l+r)/2;
build(p*2,l,mid);build(p*2+1,mid+1,r);
t[p]=pushup(t[p*2],t[p*2+1]);
}
void change(int p,int x,node q){
if(x<t[p].l||x>t[p].r)return;
if(t[p].l==t[p].r){t[p]=q;t[p].l=x,t[p].r=x;return;}
int mid=(t[p].l+t[p].r)/2;
if(x<=mid)change(p*2,x,q);
else change(p*2+1,x,q);
t[p]=pushup(t[p*2],t[p*2+1]);
}
node ask(int p,int l,int r){
if(l<=t[p].l&&r>=t[p].r)return t[p];
node tmp1,tmp2;int mid=(t[p].l+t[p].r)/2,flg1=0,flg2=0;
if(l<=mid){flg1=1,tmp1=ask(p*2,l,r);}
if(r>mid){flg2=1,tmp2=ask(p*2+1,l,r);}
if(flg1&&flg2)return pushup(tmp1,tmp2);
if(flg1)return tmp1;return tmp2;
}
void work(int x){
if(x>1)change(1,x-1,{x-1,x-1,a[x-1],a[x-1],0,pr[x-1]});
if(x<n)change(1,x+1,{x+1,x+1,a[x+1],a[x+1],0,pr[x+1]});
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
if(mp.find(a[i])==mp.end())mp[a[i]]=++cnt,s[cnt].insert(i);
else{
int y=mp[a[i]],z=*--s[y].end();
pr[i]=z,nxt[z]=i;s[y].insert(i);
}
}
build(1,1,n);
for(int i=1;i<=m;i++){
int op,x,y,l,r,k;
cin>>op;
if(op==1){
cin>>x>>y;x^=lst,y^=lst;
nxt[pr[x]]=nxt[x],pr[nxt[x]]=pr[x];
int z=a[nxt[x]];
change(1,nxt[x],{nxt[x],nxt[x],z,z,0,pr[x]});
work(nxt[x]);
s[mp[a[x]]].erase(x);
if(mp.find(y)==mp.end()){
mp[y]=++cnt;s[cnt].insert(x);
pr[x]=0,nxt[cnt]=0;
}else{
int z=mp[y];
set<int>::iterator it=s[z].lower_bound(x);
if(it==s[z].begin()){
pr[x]=0,nxt[x]=*it,pr[*it]=x;
change(1,*it,{*it,*it,a[*it],0,x});
work(*it);
}else if(it==s[z].end()){
--it;
pr[x]=*it,nxt[*it]=x,nxt[x]=0;
}else{
set<int>::iterator nit=--it;++it;
pr[*it]=x,pr[x]=*nit;
nxt[*nit]=x,nxt[x]=*it;
change(1,*it,{*it,*it,a[*it],0,x});
work(*it);
}
}
a[x]=y;
change(1,x,{x,x,y,y,0,pr[x]});
work(x);
}else{
cin>>l>>r>>k;
l^=lst,r^=lst,k^=lst;
node pp=ask(1,l,r);
if(k==0){if(pp.mx==pp.mn){lst++;cout<<"Yes\n";}else cout<<"No\n";}
else if((l==r)||((pp.mx-pp.mn==k*(r-l))&&(pp.gcd==k||pp.gcd<=0)&&(k<=0||pp.pre<l))){
lst++;cout<<"Yes\n";
}else cout<<"No\n";
}
}
return 0;
}