@ ruanshaochuan______.
push_down 函数里下传 $mulltag[p]$ 有问题:下传条件是 $mulltag[p]!=1$ 而不是 $mulltag[p]!=0$,因为 $1$ 才表示没做更改
```cpp
#include<bits/stdc++.h>
#define ls(p) p<<1
#define rs(p) p<<1|1
#define int long long
using namespace std;
const int N=1e5+5;
int n,m,tree[N*4],adddtag[N*4],a[N],mulltag[N*4],mod;
void push_up(int p)
{
tree[p]=(tree[ls(p)]%mod+tree[rs(p)]%mod)%mod;
}
void build(int p,int pl,int pr)
{
mulltag[p]=1;
if(pl==pr)
{
tree[p]=a[pl];
tree[p]%=mod;
return;
}
int mid=(pl+pr)>>1;
build(ls(p),pl,mid);
build(rs(p),mid+1,pr);
push_up(p);
}
void addtag(int p,int pl,int pr,int d)
{
adddtag[p]+=d;
adddtag[p]%=mod;
tree[p]+=d*(pr-pl+1);
tree[p]%=mod;
}
void multag(int p,int pl,int pr,int d)
{
adddtag[p]*=d;
adddtag[p]%=mod;
mulltag[p]*=d;
mulltag[p]%=mod;
tree[p]*=d;
tree[p]%=mod;
}
void push_down(int p,int pl,int pr)
{
if(mulltag[p]!=1)
{
int mid=(pl+pr)>>1;
multag(ls(p),pl,mid,mulltag[p]);
multag(rs(p),mid+1,pr,mulltag[p]);
mulltag[p]=1;
}
if(adddtag[p])
{
int mid=(pl+pr)>>1;
addtag(ls(p),pl,mid,adddtag[p]);
addtag(rs(p),mid+1,pr,adddtag[p]);
adddtag[p]=0;
}
}
void upadddata(int l,int r,int p,int pl,int pr,int d)
{
if(l<=pl&&pr<=r)
{
addtag(p,pl,pr,d);
return;
}
push_down(p,pl,pr);
int mid=(pl+pr)>>1;
if(l<=mid) upadddata(l,r,ls(p),pl,mid,d);
if(r>mid) upadddata(l,r,rs(p),mid+1,pr,d);
push_up(p);
}
void upmuldata(int l,int r,int p,int pl,int pr,int d)
{
if(l<=pl&&pr<=r)
{
multag(p,pl,pr,d);
return;
}
push_down(p,pl,pr);
int mid=(pl+pr)>>1;
if(l<=mid) upmuldata(l,r,ls(p),pl,mid,d);
if(r>mid) upmuldata(l,r,rs(p),mid+1,pr,d);
push_up(p);
}
int query(int l,int r,int p,int pl,int pr)
{
if(l<=pl&&pr<=r)
{
return tree[p];
}
push_down(p,pl,pr);
int mid=(pl+pr)>>1;
int sum=0;
if(l<=mid) sum+=query(l,r,ls(p),pl,mid);
if(r>mid) sum+=query(l,r,rs(p),mid+1,pr);
return sum;
}
signed main()
{
cin>>n>>m>>mod;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]%=mod;
}
build(1,1,n);
while(m--)
{
int op,l,r,d;
cin>>op;
if(op==1)
{
cin>>l>>r>>d;
upmuldata(l,r,1,1,n,d);
}
if(op==2)
{
cin>>l>>r>>d;
upadddata(l,r,1,1,n,d);
}
if(op==3)
{
cin>>l>>r;
cout<<query(l,r,1,1,n)%mod<<endl;
}
}
}
```
by wujingfey @ 2023-10-05 14:24:33