rt,WA 50pts,维护了区间最大最小值和区间 1−3 次方和
#include <bits/stdc++.h>
#define ull unsigned long long
#define int unsigned long long
using namespace std;
inline int read(){
int x=0;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar());
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
return x;
}
int n,m,x,y,l,r,cnt,k,a[300005],mn[600005],mx[600005],opt;
ull sum[600005],sum2[600005],sum3[600005];
inline ull sm1(int l,int r,int k){
return 1ull*(l+r)*((r-l)/k+1)/2;
}
inline ull sm2(ull l,ull r,ull k){
ull t=(r-l)/k;
return (t+1)*l*l+k*k*t*(t+1)*(t<<1|1)/6+2*l*k*t*(t+1)/2;
}
inline ull sm3(ull l,ull r,ull k){
ull t=(r-l)/k;
return (t+1)*l*l*l+3*l*k*k*t*(t+1)*(t<<1|1)/6+3*l*l*k*t*(t+1)/2+k*k*k*t*t*(t+1)*(t+1)/4;
}
void build(int p,int l,int r){
if(l==r){
sum[p]=mn[p]=mx[p]=a[l],sum2[p]=1ull*a[l]*a[l],sum3[p]=sum2[p]*sum[p];
return ;
}
int mid=l+r>>1;
build(mid<<1,l,mid);
build(mid<<1|1,mid+1,r);
sum[p]=sum[mid<<1]+sum[mid<<1|1],sum2[p]=sum2[mid<<1]+sum2[mid<<1|1],
sum3[p]=sum3[mid<<1]+sum3[mid<<1|1],mx[p]=max(mx[mid<<1],mx[mid<<1|1]),mn[p]=min(mn[mid<<1],mn[mid<<1|1]);
}
inline ull gsum1(int p,int l,int r,int lt,int rt){
if(l>=lt&&r<=rt) return sum[p];
int mid=l+r>>1;
ull res=0;
if(lt<=mid) res+=gsum1(mid<<1,l,mid,lt,rt);
if(rt>mid) res+=gsum1(mid<<1|1,mid+1,r,lt,rt);
return res;
}
inline ull gsum2(int p,int l,int r,int lt,int rt){
if(l>=lt&&r<=rt) return sum2[p];
int mid=l+r>>1;
ull res=0;
if(lt<=mid) res+=gsum2(mid<<1,l,mid,lt,rt);
if(rt>mid) res+=gsum2(mid<<1|1,mid+1,r,lt,rt);
return res;
}
inline ull gsum3(int p,int l,int r,int lt,int rt){
if(l>=lt&&r<=rt) return sum3[p];
int mid=l+r>>1;
ull res=0;
if(lt<=mid) res+=gsum3(mid<<1,l,mid,lt,rt);
if(rt>mid) res+=gsum3(mid<<1|1,mid+1,r,lt,rt);
return res;
}
inline int gmax(int p,int l,int r,int lt,int rt){
if(l>=lt&&r<=rt) return mx[p];
int mid=l+r>>1,res=0;
if(mid>=lt) res=max(res,gmax(mid<<1,l,mid,lt,rt));
if(mid<rt) res=max(res,gmax(mid<<1|1,mid+1,r,lt,rt));
return res;
}
inline int gmin(int p,int l,int r,int lt,int rt){
if(l>=lt&&r<=rt) return mn[p];
int mid=l+r>>1,res=INT_MAX;
if(mid>=lt) res=min(res,gmin(mid<<1,l,mid,lt,rt));
if(mid<rt) res=min(res,gmin(mid<<1|1,mid+1,r,lt,rt));
return res;
}
inline void upd(int p,int l,int r,int pos,int val){
if(l==r){
sum[p]=mn[p]=mx[p]=val,sum2[p]=1ull*val*val,sum3[p]=sum2[p]*sum[p];
return ;
}
int mid=l+r>>1;
if(pos<=mid) upd(mid<<1,l,mid,pos,val);
else upd(mid<<1|1,mid+1,r,pos,val);
sum[p]=sum[mid<<1]+sum[mid<<1|1],sum2[p]=sum2[mid<<1]+sum2[mid<<1|1],
sum3[p]=sum3[mid<<1]+sum3[mid<<1|1],mx[p]=max(mx[mid<<1],mx[mid<<1|1]),mn[p]=min(mn[mid<<1],mn[mid<<1|1]);
}
signed main(){
// cout<<sm3(1,5,2)<<endl;
n=read(),m=read();
for(int i=1;i<=n;i++)
a[i]=read();
build(1,1,n);
while(m--){
opt=read();
if(opt==1)
x=read(),y=read(),x^=cnt,y^=cnt,upd(1,1,n,x,y);
else{
l=read(),r=read(),k=read();
l^=cnt,r^=cnt,k^=cnt;
if(l>r) swap(l,r);
if(l==r){
puts("Yes"),cnt++;
continue;
}
if(!k){
if(gmin(1,1,n,l,r)==gmax(1,1,n,l,r)) puts("Yes"),cnt++;
else puts("No");
continue;
}
// cout<<l<<" "<<r<<" "<<k<<endl;
int gmn=gmin(1,1,n,l,r),gmx=gmax(1,1,n,l,r),d=gmx-gmn;
// cerr<<gmn<<" "<<gmx<<endl;
if(d%k){
puts("No");
continue;
}
int dd=d/k+1;
if(dd^(r-l+1)){
// cout<< dd <<" "<< r-l+1<<endl;
puts("No");
continue;
}
// cerr<<sm1(gmn,gmx,k)<<endl;
if(sm1(gmn,gmx,k)^gsum1(1,1,n,l,r)) puts("No");
else if(sm2(gmn,gmx,k)^gsum2(1,1,n,l,r)) puts("No");
else if(sm3(gmn,gmx,k)^gsum3(1,1,n,l,r)) puts("No");
else cnt++,puts("Yes");
}
}
return 0;
}