re+mle+wa
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define il inline
#define int long long
#define ls(x) x<<1
#define rs(x) x<<1|1
using namespace std;
const int N=3e5+5;
il int read()
{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*f;
}
int n,m,a[N],anss;
struct node{
int mn,mx,sum;
node(){mn=1e9,mx=-1e9,sum=0;}
node operator +(node x){
node ans;
ans.sum=sum+x.sum;
ans.mx=max(mx,x.mx);
ans.mn=max(mn,x.mn);
return ans;
}
}tree[N<<1];
void pushup(int x){
tree[x].sum=tree[ls(x)].sum+tree[rs(x)].sum;
tree[x].mn=min(tree[ls(x)].mn,tree[rs(x)].mn);
tree[x].mx=max(tree[ls(x)].mx,tree[rs(x)].mx);
}
void build(int x,int l,int r){
if(l==r){
tree[x].sum=tree[x].mn=tree[x].mx=a[l];
return;
}
int mid=(l+r)>>1;
build(ls(x),l,mid);
build(rs(x),mid+1,r);
pushup(x);
}
void change(int u,int l,int r,int x,int v){
if(l==r&&l==x){
tree[u].sum=tree[u].mn=tree[u].mx=v;
return;
}
int mid=(l+r)>>1;
if(x<=mid)
change(ls(u),l,mid,x,v);
else
change(rs(u),mid+1,r,x,v);
pushup(u);
}
node query(int u,int l,int r,int x,int y){
if(l>=x&&y>=r){
return tree[u];
}
int mid=(l+r)>>1;
node ans=node();
if(x<=mid)
ans=ans+query(ls(u),l,mid,x,y);
if(mid<y)
ans=ans+query(rs(u),mid+1,r,x,y);
return ans;
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
build(1,1,n);
while(m--){
int opt=read(),x=read(),y=read();
x^=anss,y^=anss;
if(opt==1) change(1,1,n,x,y);
if(opt==2) {
int k=read();
k^=anss;
node zyy=query(1,1,n,x,y);
if(zyy.mx-zyy.mn==(y-x)*k&&zyy.sum==(zyy.mx+zyy.mn)*(y-x+1)/2)
cout<<"Yes\n",anss++;
else cout<<"No\n";
}
}
return 0;
}
是数据加强了还是我有小错误没改到。