@[凤凰工作室](/user/491007)
```cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
int arr[100005],n,q,m;
class stree
{
public:
int l,r,sum;
}tree[800005];
int lazya[800005],lazym[800005];
void pushup(int k)
{
tree[k].sum=(tree[k<<1].sum+tree[k<<1|1].sum)%m;
}
void pushdown(int k)
{
tree[k<<1].sum=((tree[k<<1].sum*lazym[k])%m+(lazya[k]*(tree[k<<1].r-tree[k<<1].l+1))%m)%m;
tree[k<<1|1].sum=((tree[k<<1|1].sum*lazym[k])%m+(lazya[k]*(tree[k<<1|1].r-tree[k<<1|1].l+1))%m)%m;
lazya[k<<1]=((lazya[k<<1]*lazym[k])%m+lazya[k])%m;
lazya[k<<1|1]=((lazya[k<<1|1]*lazym[k])%m+lazya[k])%m;
lazym[k<<1]=(lazym[k<<1]*lazym[k])%m;
lazym[k<<1|1]=(lazym[k<<1|1]*lazym[k])%m;
lazya[k]=0;
lazym[k]=1;
}
void add(int L,int R,int k,int c)
{
if(L<=tree[k].l&&tree[k].r<=R)
{
lazya[k]=(lazya[k]+c)%m;
tree[k].sum=(tree[k].sum+c*(tree[k].r-tree[k].l+1)%m)%m;
return;
}
pushdown(k);
int mid=(tree[k].r+tree[k].l)>>1;
if(L<=mid)add(L,R,k<<1,c);
if(R>mid)add(L,R,k<<1|1,c);
pushup(k);
}
void mul(int L,int R,int k,int c)
{
if(L<=tree[k].l&&tree[k].r<=R)
{
lazym[k]=(lazym[k]*c)%m;
lazya[k]=(lazya[k]*c)%m;
tree[k].sum=(tree[k].sum*c)%m;
return;
}
pushdown(k);
int mid=(tree[k].r+tree[k].l)>>1;
if(L<=mid)mul(L,R,k<<1,c);
if(R>mid)mul(L,R,k<<1|1,c);
pushup(k);
}
void build(int L,int R,int k)
{
lazym[k]=1;
tree[k].r=R;tree[k].l=L;
if(R==L)
{
tree[k].sum=arr[R]%m;
return;
}
int mid=(tree[k].r+tree[k].l)>>1;
build(L,mid,k<<1);
build(mid+1,R,k<<1|1);
pushup(k);
}
int qurey(int L,int R,int k)
{
if(L<=tree[k].l&&tree[k].r<=R)
{
return tree[k].sum;
}
pushdown(k);
int mid=(tree[k].r+tree[k].l)>>1;
int sum=0;
if(L<=mid)sum=(sum+qurey(L,R,k<<1))%m;
if(R>mid)sum=(sum+qurey(L,R,k<<1|1))%m;
return sum;
}
signed main(void)
{
cin>>n>>q>>m;
for(int i=1;i<=n;i++)
cin>>arr[i];
build(1,n,1);
while(q--)
{
int op;
cin>>op;
if(op==1)
{
int x,y,k;
cin>>x>>y>>k;
mul(x,y,1,k);
}
if(op==2)
{
int x,y,k;
cin>>x>>y>>k;
add(x,y,1,k);
}
if(op==3)
{
int x,y;
cin>>x>>y;
cout<<qurey(x,y,1)<<endl;
}
}
return 0;
}
```
87,88行改了下
by _xYZPx_ @ 2023-11-25 17:15:53