3WA 7RE,RE信息
Runtime Error.
Received signal 8: Floating-point exception.
线段树维护区间最大,最小值,平方和,使用 int128 防止溢出.
#include<cstdio>
#define i128 __int128_t
i128 a[300001];
const i128 b=1;
int lastans;
struct tree{
i128 maxn,minn,sum;
}tre[2400001];
i128 max(i128 x,i128 y){
return x>y?x:y;
}
i128 min(i128 x,i128 y){
return x<y?x:y;
}
void pushup(int k){
tre[k].maxn=max(tre[k<<1].maxn,tre[k<<1|1].maxn);
tre[k].minn=min(tre[k<<1].minn,tre[k<<1|1].minn);
tre[k].sum=tre[k<<1].sum+tre[k<<1|1].sum;
}
void build(int k,int l,int r){
if(l==r){
tre[k].maxn=tre[k].minn=a[l];
tre[k].sum=a[l]*a[l];
return;
}
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k);
}
void change(int k,int l,int r,int x,i128 v){
if(l==r){
tre[k].maxn=tre[k].minn=v;
tre[k].sum=v*v;
return;
}
int mid=l+r>>1;
if(x<=mid)change(k<<1,l,mid,x,v);
if(mid<x)change(k<<1|1,mid+1,r,x,v);
pushup(k);
}
i128 qmax(int k,int l,int r,int x,int y){
if(l>=x&&r<=y)return tre[k].maxn;
int mid=l+r>>1;
i128 ans=0;
if(x<=mid)ans=max(ans,qmax(k<<1,l,mid,x,y));
if(mid<y)ans=max(ans,qmax(k<<1|1,mid+1,r,x,y));
return ans;
}
i128 qmin(int k,int l,int r,int x,int y){
if(l>=x&&r<=y)return tre[k].minn;
int mid=l+r>>1;
i128 ans=b*100000000*100000000*100000000*100000000;
if(x<=mid)ans=min(ans,qmin(k<<1,l,mid,x,y));
if(mid<y)ans=min(ans,qmin(k<<1|1,mid+1,r,x,y));
return ans;
}
i128 qsum(int k,int l,int r,int x,int y){
if(l>=x&&r<=y)return tre[k].sum;
int mid=l+r>>1;
i128 ans=0;
if(x<=mid)ans+=qsum(k<<1,l,mid,x,y);
if(mid<y)ans+=qsum(k<<1|1,mid+1,r,x,y);
return ans;
}
i128 read(){
i128 x=0;
char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x;
}
void write(i128 x){
if(x<10)putchar(x+'0');
else write(x/10),putchar(x%10+'0');
}
int main(){
int n,m,i;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)a[i]=read();
build(1,1,n);
while(m--){
int op;
scanf("%d",&op);
if(op==1){
int x;
i128 y;
scanf("%d",&x);
y=read();
x^=lastans;
y^=lastans;
change(1,1,n,x,y);
continue;
}
int l,r;
i128 k;
scanf("%d%d",&l,&r);
k=read();
k^=lastans;
l^=lastans;
r^=lastans;
if(l>r){
int w=l;
l=r;
r=w;
}
i128 mx=qmax(1,1,n,l,r),mn=qmin(1,1,n,l,r),res=qsum(1,1,n,l,r);
if((mx-mn)%k!=0){
printf("No\n");
continue;
}
if((mx-mn)/k+1!=r-l+1){
printf("No\n");
continue;
}
if(mn*mn*(r-l+1)+mn*k*(r-l+1)*(r-l)+(r-l+1)*(r-l)/(6)*(2*r-2*l+1)*k*k!=res)printf("No\n");
else printf("Yes\n"),lastans++;
}
}