https://www.luogu.com.cn/record/136276251
#include<bits/stdc++.h>
using namespace std;
struct node{
int mi,mx,lst,gcd;
node(int mi=2e9,int mx=0,int lst=0,int gcd=0):mi(mi),mx(mx),lst(lst),gcd(gcd){}
node operator+(const node &k)const{return node(min(mi,k.mi),max(mx,k.mx),max(lst,k.lst),__gcd(gcd,k.gcd));}
}t[1200001];
int n,m,p,x,y,k,tot,lst,a[300011];
map <int,int> id;
set <int> col[600001];
set <int> ::iterator it;
void update(int rt,int l,int r,int x,node k){
if(l==r){
t[rt]=k;
return;
}
int mid=(l+r)>>1;
if(x<=mid) update(rt*2,l,mid,x,k);
else update(rt*2+1,mid+1,r,x,k);
t[rt]=t[rt*2]+t[rt*2+1];
}
node query(int rt,int l,int r,int L,int R){
if(L<=l&&r<=R) return t[rt];
int mid=(l+r)>>1;
node res;
if(L<=mid) res=res+query(rt*2,l,mid,L,R);
if(R>mid) res=res+query(rt*2+1,mid+1,r,L,R);
return res;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
if(!id[a[i]]) id[a[i]]=++tot,col[tot].insert(0);
update(1,1,n,i,node(a[i],a[i],*col[id[a[i]]].rbegin(),abs(a[i]-a[i+1])));
col[id[a[i]]].insert(i);
}
while(m--){
scanf("%d%d%d",&p,&x,&y),x^=lst,y^=lst;
if(p==1){
it=col[id[a[x]]].find(x);
if((++it)!=col[id[a[x]]].end()) k=(*it----),update(1,1,n,k,node(a[k],a[k],*it,abs(a[k]-a[k+1])));
col[id[a[x]]].erase(x);
if(!id[a[x]=y]) id[y]=++tot,col[tot].insert(0);
it=col[id[y]].lower_bound(x);
update(1,1,n,x,node(y,y,*--it,abs(a[x]-a[x+1])));
if(x!=1) update(1,1,n,x-1,node(a[x-1],a[x-1],query(1,1,n,x-1,x-1).lst,abs(a[x-1]-a[x])));
if((++it)!=col[id[y]].end()) update(1,1,n,*it,node(y,y,x,abs(a[*it]-a[(*it)+1])));
col[id[y]].insert(x);
}
else{
scanf("%d",&k),k^=lst;
if(x==y) printf("Yes\n"),lst++;
else{
node h=query(1,1,n,x,y-1),g=query(1,1,n,y,y)+h;
if(!k){
if(g.mi==g.mx) printf("Yes\n"),lst++;
else printf("No\n");
}
else{
if(h.gcd%k==0&&g.lst<x&&g.mi+k*(y-x)==g.mx) printf("Yes\n"),lst++;
else printf("No\n");
}
}
}
}
return 0;
}