全部是把 Yes 判成 No /shq/cy
代码中 query1 求 i=l∑rai query2 求 i=l∑rai2 query3 求 min query4 求 max
判断方式是判断 max−min 和 i=l∑rai 和 i=l∑rai2
(线段树除了取模应该没锅/kel)
// wish to get better qwq
#include<bits/stdc++.h>
#define re register ll
#define pb push_back
#define xl (x<<1)
#define xr (x<<1|1)
#define mid ((l+r)>>1)
#define int long long
using namespace std;
typedef long long ll;
template <typename T> void rd(T &x){
int fl=1;x=0;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') fl=-fl;
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
x*=fl;
}
void wr(int x){
if(x<0) x=-x,putchar('-');
if(x<10) putchar(x+'0');
if(x>9) wr(x/10),putchar(x%10+'0');
}
// ---------- IO ---------- //
const int N=5e5+5,mod=1e9+7,M=1e9+10;
int n,m,v[N],ans,two,six;
inline int pw(int x,int y){
int sum=1;
while(y){
if(y&1) sum=(sum*x)%mod;
x=(x*x)%mod;y>>=1;
}
return sum;
}
struct Segment_Tree{
int sum[N<<2],ss[N<<2],lazy[N<<2],maxn[N<<2],minn[N<<2];
inline void pushup(int x){
maxn[x]=max(maxn[xl],maxn[xr]);
minn[x]=min(minn[xl],minn[xr]);
(sum[x]=sum[xl]+sum[xr])%=mod;
(ss[x]=ss[xl]+ss[xr])%=mod;
}
inline void build(int l,int r,int x){
if(l==r){maxn[x]=minn[x]=sum[x]=v[l];ss[x]=v[l]*v[l]%mod;return ;}
build(l,mid,xl);build(mid+1,r,xr);
pushup(x);
}
inline void pushdown(int x,int l,int r){
lazy[xl]+=lazy[x];
lazy[xr]+=lazy[x];
maxn[xl]+=lazy[x];
maxn[xr]+=lazy[x];
minn[xl]+=lazy[x];
minn[xr]+=lazy[x];
(ss[xl]+=sum[xl]*lazy[x]%mod*2ll+lazy[x]*lazy[x]%mod*(mid-l+1ll)%mod)%=mod;
(ss[xr]+=sum[xr]*lazy[x]%mod*2ll+lazy[x]*lazy[x]%mod*(r-mid)%mod)%=mod;
(sum[xl]+=lazy[x]*(mid-l+1ll))%=mod;
(sum[xr]+=lazy[x]*(r-mid))%=mod;
lazy[x]=0;
}
inline void modify(int L,int R,int l,int r,int k,int x){
if(l>R||r<L||l>r) return ;
if(L<=l&&r<=R){lazy[x]+=k;maxn[x]+=k;minn[x]+=k;(ss[x]+=k*sum[x]*2ll+k*k%mod*(r-l+1ll))%=mod;(sum[x]+=k*(r-l+1ll))%=mod;return ;}
pushdown(x,l,r);
modify(L,R,l,mid,k,xl);modify(L,R,mid+1,r,k,xr);
pushup(x);
}
inline int query1(int L,int R,int l,int r,int x){
if(l>R||r<L||l>r) return 0;
if(L<=l&&r<=R) return sum[x];
pushdown(x,l,r);pushup(x);
return (query1(L,R,l,mid,xl)+query1(L,R,mid+1,r,xr))%mod;
}
inline int query2(int L,int R,int l,int r,int x){
if(l>R||r<L||l>r) return 0;
if(L<=l&&r<=R) return ss[x];
pushdown(x,l,r);pushup(x);
return (query2(L,R,l,mid,xl)+query2(L,R,mid+1,r,xr))%mod;
}
inline int query3(int L,int R,int l,int r,int x){
if(l>R||r<L||l>r) return 0;
if(L<=l&&r<=R) return maxn[x];
pushdown(x,l,r);pushup(x);
return max(query3(L,R,l,mid,xl),query3(L,R,mid+1,r,xr));
}
inline int query4(int L,int R,int l,int r,int x){
if(l>R||r<L||l>r) return M;
if(L<=l&&r<=R) return minn[x];
pushdown(x,l,r);pushup(x);
return min(query4(L,R,l,mid,xl),query4(L,R,mid+1,r,xr));
}
}tr;
// ---------- Segment Tree ---------- //
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
// ios::sync_with_stdio(0);
rd(n);rd(m);two=pw(2ll,mod-2);six=pw(6ll,mod-2);
for(re i=1;i<=n;i++) rd(v[i]);
tr.build(1,n,1);
int op,a,b,k;
for(re i=1;i<=m;i++){
rd(op);rd(a);rd(b);a^=ans;b^=ans;
if(op==1) tr.modify(a,a,1,n,b-v[a],1),v[a]=b;
else{
rd(k);k^=ans;
int qaq=tr.query3(a,b,1,n,1),qwq=tr.query4(a,b,1,n,1);
// cout<<a<<' '<<b<<' '<<tr.query1(a,b,1,n,1)<<' '<<tr.query2(a,b,1,n,1)<<' '<<a<<' '<<b<<' '<<(b*(b+1)*(b*2+1)%mod-(a-1)*a*(a*2-1)%mod+mod)%mod*pw(6,mod-2)%mod<<endl;
if(qaq-qwq!=(b-a)*k){puts("No");continue;}
if(tr.query1(a,b,1,n,1)%mod!=(qaq+qwq)%mod*(qaq-qwq+1ll)%mod*two%mod){puts("No");continue;}
if(tr.query2(a,b,1,n,1)%mod!=(qwq*qwq%mod*(b-a+1ll)%mod+k%mod*qwq%mod*(b-a)%mod*(b-a+1ll)%mod+k*k%mod*(b-a)%mod*(b-a+1ll)%mod*(b*2ll-a*2ll+1ll)%mod*six%mod)%mod){puts("No");continue;}
puts("Yes");ans++;
}
}
return 0;
}
// ---------- Main ---------- //