#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 10;
int n,m;
int a[maxn] , nnn = 0 ;
struct node{
int mx , mn ;
int pre , gc;
}tr[maxn << 2] , ansl ;
int pr[maxn];
map<int,int> mp ;
set<int> st[maxn];
#define lc 2 * o
#define rc 2 * o + 1
node merge(node x,node y){
ansl.mx = max(x.mx,y.mx);
ansl.mn = min(x.mn,y.mn);
ansl.pre = max(x.pre,y.pre);
ansl.gc = __gcd(x.gc,y.gc);
return ansl;
}
void build(int o,int l,int r){
if(l == r){
tr[o].mx = tr[o].mn = a[l];
if(l < n) tr[o].gc = abs(a[l] - a[l + 1]); else tr[o].gc = 0;
tr[o].pre = pr[l];
return;
}
int mid = (l + r) >> 1;
build(2 * o , l , mid);
build(2 * o + 1 , mid + 1 , r);
tr[o] = merge(tr[lc],tr[rc]);
}
void change(int o,int l,int r,int c){
if(l == r && r == c){
tr[o].mx = tr[o].mn = a[l];
tr[o].gc = abs(a[l] - a[l + 1]);
tr[o].pre = pr[l];
return;
}
int mid = (l + r) >> 1;
if(c <= mid) change(lc,l,mid,c);
else change(rc,mid + 1,r,c);
tr[o] = merge(tr[lc],tr[rc]);
}
node query(int o,int l,int r,int c,int d){
if(c <= l && r <= d){
return tr[o];
}
int mid = (l + r) >> 1;
node ans;
ans.mx = -1 , ans.gc = 0 , ans.mn = 1e9 , ans.pre = 0;
if(mid >= c) ans = merge(ans,query(lc,l,mid,c,d));
if(mid < d) ans = merge(ans,query(rc,mid+1,r,c,d));
return ans;
}
int main(){
scanf("%d%d",&n,&m);
int cnt = 0;
for(int i = 1;i <= n; i++){
scanf("%d",&a[i]);
if(!mp[a[i]]){
mp[a[i]] = ++cnt;
st[cnt].insert(0);
st[cnt].insert(n + 1);
st[cnt].insert(i);
}else{
st[mp[a[i]]].insert(i);
pr[i] = *--(st[mp[a[i]]].lower_bound(i));
}
}
build(1,1,n);
int op , x , y , z;
while(m--){
scanf("%d%d%d",&op,&x,&y);
x ^= nnn , y ^= nnn;
if( op == 1 ){
int tmp = *st[mp[a[x]]].upper_bound(x);
if(tmp != n + 1){
pr[tmp] = pr[x];
change(1,1,n,tmp);
}
st[mp[a[x]]].erase(x);
a[x] = y;
if(!mp[y]){
mp[y] = ++ cnt;
st[cnt].insert(0);
st[cnt].insert(n + 1);
st[cnt].insert(x);
pr[x] = 0;
}else{
st[mp[y]].insert(x);
pr[x] = *--(st[mp[y]].lower_bound(x));
}
tmp = *st[mp[y]].upper_bound(x);
if(tmp != n + 1){
pr[tmp] = x;
change(1,1,n,tmp);
}
if(x == n) a[n + 1] = y;
change(1,1,n,x);
if(x > 1) change(1,1,n,x - 1);
}
if( op == 2 ){
if(x > y) swap(x,y);
scanf("%d",&z);
z ^= nnn;
ansl = query(1,1,n,x,y);
if(z == 0) {
if(ansl.mx != ansl.mn) printf("No\n");
else nnn ++ , printf("Yes\n");
}else{
if(ansl.mx - ansl.mn != z * (y-x) || ansl.gc % z != 0 || ansl.pre >= x) printf("No\n");
else nnn ++ , printf("Yes\n");
}
}
}
return 0;
}