#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
const int INF=0x3f3f3f3f;
int n,m,la,a[N],pr[N],af[N],cnt;
map<int,int>mp;
set<int>s[N];
int gcd(int a, int b){
return (b==0)?a:gcd(b,a%b);
}
struct node{
int l,r,g,maxn,minn,pn,an,pm;
node operator +(const node &a){
node c;
c.l=l;
c.r=a.r;
c.pm=max(pm,a.pm);
c.g=gcd(gcd(g,a.g),abs(a.pn-an));
c.maxn=max(maxn,a.maxn);
c.minn=min(minn,a.minn);
c.an=a.an;
c.pn=pn;
return c;
}
}tree[N<<2];
int re(){
int sum=0,fh=1;
char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar()){
fh-=(ch=='-')<<1;
}
for (;ch>='0'&&ch<='9';ch=getchar()){
sum=sum*10+(ch^48);
}
return sum*fh;
}
void build(int p, int l, int r){
tree[p].l=l;
tree[p].r=r;
if(l==r){
tree[p].g=0;
tree[p].maxn=tree[p].minn=tree[p].pn=tree[p].an=a[l];
tree[p].pm=pr[l];
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
tree[p]=tree[p<<1]+tree[p<<1|1];
}
void change(int p,int x,node v){
if(x==0){
return;
}
if(tree[p].l==tree[p].r){
tree[p]=v;
return;
}
int mid=(tree[p].l+tree[p].r)>>1;
if(x<=mid){
change(p<<1,x,v);
}else{
change(p<<1|1,x,v);
}
tree[p]=tree[p<<1]+tree[p<<1|1];
}
node ask(int p,int l,int r){
if(tree[p].l>=l&&tree[p].r<=r){
return tree[p];
}
int mid=(tree[p].l+tree[p].r)>>1;
if(l<=mid&&r>mid){
return ask(p<<1,l,r)+ask(p<<1|1,l,r);
}else if(l<=mid){
return ask(p<<1,l,r);
}else{
return ask(p<<1|1,l,r);
}
}
void w1(int la){
int x=re()^la,y=re()^la;
af[pr[x]]=af[x];
pr[af[x]]=pr[x];
change(1,af[x],(node){af[x],af[x],0,a[af[x]],a[af[x]],a[af[x]],a[af[x]],pr[af[x]]});
s[mp[a[x]]].erase(x);
a[x]=y;
pr[x]=af[x]=0;
if(mp.find(y)==mp.end()){
mp[y]=++cnt;
s[cnt].insert(x);
change(1,x,(node){x,x,0,y,y,y,y,0});
return ;
}
y=mp[y];
auto it=s[y].lower_bound(x);
if(it==s[y].begin()){
af[x]=*s[y].begin();
pr[*s[y].begin()]=x;
change(1,x,(node){x,x,0,a[x],a[x],a[x],a[x],0});
int tmp=*s[y].begin();
change(1,tmp,(node){tmp,tmp,0,a[tmp],a[tmp],a[tmp],a[tmp],pr[tmp]});
s[y].insert(x);
}else if(it==s[y].end()){
it--;
pr[x]=*it;
af[*it]=x;
change(1,x,(node){x,x,0,a[x],a[x],a[x],a[x],pr[x]});
s[y].insert(x);
}else{
auto it2=it;
it--;
pr[x]=*it;
af[x]=*it2;
af[*it]=x;
pr[*it2]=x;
change(1,x,(node){x,x,0,a[x],a[x],a[x],a[x],pr[x]});
int tmp=*it2;
change(1,tmp,(node){tmp,tmp,0,a[tmp],a[tmp],a[tmp],a[tmp],pr[tmp]});
s[y].insert(x);
}
}
void w2(int &la){
int l=re()^la,r=re()^la,k=re()^la;
if(l>r){
swap(l,r);
}
node tmp=ask(1,l,r);
if(((tmp.maxn-tmp.minn)==1ll*(r-l)*k)&&(tmp.g==k||!tmp.g)&&(tmp.pm<l||k==0)){
cout<<"Yes"<<endl;
la++;
}else{
cout<<"No"<<endl;
}
}
signed main(){
n=re(),m=re();
for(int i=1;i<=n;i++){
a[i]=re();
if(mp.find(a[i])==mp.end()){
mp[a[i]]=++cnt;
s[mp[a[i]]].insert(i);
}else{
pr[i]=*--s[mp[a[i]]].end();
af[*--s[mp[a[i]]].end()]=i;
s[mp[a[i]]].insert(i);
}
}
build(1,1,n);
for(int i=1,x;i<=m;i++){
x=re();
if(x==1){
w1(la);
}else{
w2(la);
}
}
return 0;
}