```cpp
int query(int l,int r,int p){
if(l<=t[p].l&&t[p].r<=r)return t[p].sum%m;
pushdn(p);
int mid=(t[p].l+t[p].r)>>1;
int res=0;
if(l<=mid)res+=query(l,r,p*2)%m,res%=m;
if(mid<r)res+=query(l,r,p*2+1)%m,res%=m;
return res%m;
}
```
改
```cpp
int query(int l,int r,int p){
pushdn(p);
if(l<=t[p].l&&t[p].r<=r)return t[p].sum%m;
int mid=(t[p].l+t[p].r)>>1;
int res=0;
if(l<=mid)res+=query(l,r,p*2)%m,res%=m;
if(mid<r)res+=query(l,r,p*2+1)%m,res%=m;
return res%m;
}
```
by Big_Dinosaur @ 2024-02-20 13:39:47
两个问题:
- build()中初始化时乘法懒标记未初始化成1
- 模数不对
但是改完还是30pts
建议重构一遍过/youl
by docxjun @ 2024-02-20 13:40:11
@[xht_G](/user/823535)
1. 模数是要输入的,有问题。
1. `pushdn` 部分有大问题,我给你重构了。
```cpp
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define PII pair<int,int>
#define DB double
#define LL long long
#define int long long
using namespace std;
int m;
//int m;
inline int read(long long md){
if(md==0)md=LONG_LONG_MAX;
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=(x*10%md+(ch-48)%md)%md;ch=getchar();}
return x*f;
}
struct Node{
int sum,a,t=1;
int l,r;
}t[400005];
int a[100005];
void build(int l,int r,int p){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].sum=a[l]%m;
t[p].t=1;
return;
}
int mid=(t[p].l+t[p].r)>>1;
build(l,mid,p*2),build(mid+1,r,p*2+1);
t[p].sum=(t[p*2].sum%m+t[p*2+1].sum%m)%m;
}
void pushdn(int p){
t[p*2].sum=(t[p].t*t[p*2].sum+t[p].a*(t[p*2].r-t[p*2].l+1))%m;
t[p*2+1].sum=(t[p].t*t[p*2+1].sum+t[p].a*(t[p*2+1].r-t[p*2+1].l+1))%m;
t[p*2].t=(t[p*2].t*t[p].t)%m;
t[p*2+1].t=(t[p*2+1].t*t[p].t)%m;
t[p*2].a=(t[p*2].a*t[p].t+t[p].a)%m;
t[p*2+1].a=(t[p*2+1].a*t[p].t+t[p].a)%m;
t[p].a=0,t[p].t=1;
}
int query(int l,int r,int p){
if(l<=t[p].l&&t[p].r<=r)return t[p].sum%m;
pushdn(p);
int mid=(t[p].l+t[p].r)>>1;
int res=0;
if(l<=mid)res+=query(l,r,p*2)%m,res%=m;
if(mid<r)res+=query(l,r,p*2+1)%m,res%=m;
return res%m;
}
void update1(int l,int r,int c,int p){
if(l<=t[p].l&&t[p].r<=r){
// pushdn(p);
t[p].sum+=c%m*(t[p].r-t[p].l+1)%m,t[p].sum%=m;
t[p].a+=c%m,t[p].a%=m;
return;
}
pushdn(p);
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid)update1(l,r,c,p*2);
if(mid<r)update1(l,r,c,p*2+1);
t[p].sum=t[p*2].sum%m+t[p*2+1].sum%m,t[p].sum%=m;
}
void update2(int l,int r,int c,int p){
if(l<=t[p].l&&t[p].r<=r){
// pushdn(p);
t[p].sum*=c%m,t[p].sum%=m;
t[p].t*=c%m,t[p].t%=m;
t[p].a*=c%m,t[p].a%=m;
return;
}
pushdn(p);
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid)update2(l,r,c,p*2);
if(mid<r)update2(l,r,c,p*2+1);
t[p].sum=t[p*2].sum%m+t[p*2+1].sum%m,t[p].sum%=m;
}
signed main(){
int n,q;
n=read(0),q=read(0),m=read(0);
for(int i=1;i<=n;i++)
a[i]=read(0);
build(1,n,1);
while(q--){
int op=read(0);
if(op==1){
int x=read(0),y=read(0),k=read(0);
update2(x,y,k,1);
// cout<<"-------------------------------------------\n";
// for(int i=1;i<=2*n;i++)
// cout<<t[i].l<<' '<<t[i].r<<' '<<t[i].a<<' '<<t[i].t<<' '<<t[i].sum<<'\n';
// cout<<query(x,y,1)<<'\n';
// cout<<"-------------------------------------------\n";
}
if(op==2){
int x=read(0),y=read(0),k=read(0);
update1(x,y,k,1);
// cout<<"-------------------------------------------\n";
// for(int i=1;i<=2*n;i++)
// cout<<t[i].l<<' '<<t[i].r<<' '<<t[i].a<<' '<<t[i].t<<' '<<t[i].sum<<'\n';
// cout<<query(x,y,1)<<'\n';
// cout<<"-------------------------------------------\n";
}
if(op==3){
int x=read(0),y=read(0);
LL ans=query(x,y,1);
cout<<ans<<'\n';
}
}
return 0;
}
```
by shoot_down @ 2024-02-20 13:50:37
@[Big_Dinosaur](/user/835600) 已A,thx
by xht_G @ 2024-02-20 14:07:18
@[docxjun](/user/580135) 已A,thx
by xht_G @ 2024-02-20 14:07:35
@[shoot_down](/user/616964) 已A,thx
by xht_G @ 2024-02-20 14:07:50
此贴结
by xht_G @ 2024-02-20 14:08:18