你把pushdown里的if判断去掉试一下
by emmoy @ 2024-02-03 11:25:29
已过,谢谢大佬
by maichong @ 2024-02-03 11:27:27
@[maichong](/user/955369)
```cpp
#include <bits/stdc++.h>
using namespace std;
const int MAXN=4e5+10;
long long tree[MAXN],a[MAXN],tag[MAXN],tag2[MAXN],n,m,p;
void push_up(int x){
tree[x]=(tree[x*2]+tree[x*2+1])%p;
return;
}
void push_down(long long x,long long xl,long long xr){
long long mid=(xl+xr)/2;
tree[x*2]=(tree[x*2]*tag2[x])%p;
tree[x*2]=(tree[x*2]+(mid-xl+1)*tag[x])%p;
tag[x*2]=(tag[x*2]*tag2[x]+tag[x])%p;
tag2[x*2]=(tag2[x*2]*tag2[x])%p;
tree[x*2+1]=(tree[x*2+1]*tag2[x])%p;
tree[x*2+1]=(tree[x*2+1]+(xr-mid)*tag[x])%p;
tag[x*2+1]=(tag[x*2+1]*tag2[x]+tag[x])%p;
tag2[x*2+1]=(tag2[x*2+1]*tag2[x])%p;
tag[x]=0;
tag2[x]=1;
return;
}
void build(long long x,long long xl,long long xr){
tag2[x]=1;
if(xl==xr){
tree[x]=a[xl]%p;
return;
}
int mid=(xl+xr)>>1;
build(x*2,xl,mid);
build(x*2+1,mid+1,xr);
push_up(x);
return;
}
long long sumlr(long long x,long long xl,long long xr,long long L,long long R){
if(L<=xl&&R>=xr)return tree[x]%p;
long long s=0;
push_down(x,xl,xr);
long long mid=(xl+xr)>>1;
if(L<=mid)s=(s+sumlr(x*2,xl,mid,L,R))%p;
if(R>mid)s=(s+sumlr(x*2+1,mid+1,xr,L,R))%p;
return s;
}
void changelr(long long x,long long xl,long long xr,long long L,long long R,long long k){
if(L<=xl&&R>=xr){
tag[x]=(tag[x]+k)%p;
tree[x]=(tree[x]+(xr-xl+1)*k)%p;
return;
}
push_down(x,xl,xr);
long long mid=(xl+xr)>>1;
if(L<=mid)changelr(x*2,xl,mid,L,R,k);
if(R>mid)changelr(x*2+1,mid+1,xr,L,R,k);
push_up(x);
return;
}
void chenglr(long long x,long long xl,long long xr,long long L,long long R,long long k){
if(L<=xl&&R>=xr){
tag2[x]=(tag2[x]*k)%p;
tag[x]=(tag[x]*k)%p;
tree[x]=(tree[x]*k)%p;
return;
}
push_down(x,xl,xr);
long long mid=(xl+xr)/2;
if(L<=mid)chenglr(x*2,xl,mid,L,R,k);
if(R>mid)chenglr(x*2+1,mid+1,xr,L,R,k);
push_up(x);
return;
}
int main(){
cin>>n>>m>>p;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
long long opt,l,r,k;
scanf("%lld%lld%lld",&opt,&l,&r);
if(opt==1){
scanf("%lld",&k);
chenglr(1,1,n,l,r,k);
}else if(opt==2){
scanf("%lld",&k);
changelr(1,1,n,l,r,k);
}else printf("%lld\n",sumlr(1,1,n,l,r)%p);
}
return 0;
}
```
by emmoy @ 2024-02-03 11:27:35
@[emmoy](/user/874990) 求教大佬为什么这里不用if判断,我也挂的这里,但是感觉没什么问题QAQ
by W_Makima @ 2024-02-19 16:14:38
@[W_Makima](/user/1189452) 哦,是不是K有可能是负数,那个tag2[x]改成tag2[x]!=1好像就过去了
by W_Makima @ 2024-02-19 16:23:24