不知道为什么……
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+7;
struct ST
{
ll sum,multag,addtag;
}tree[maxn<<2];
int a[maxn],n,m,p;
void build(int x,int l,int r)
{
tree[x].addtag=0;
tree[x].multag=1;
if(l==r)
{
tree[x].sum=a[l]%p;
return;
}
int mid=l+r>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%p;
return;
}
void pushdown(int x,int l,int r)
{
if(tree[x].multag!=1)
{
tree[x<<1].multag=tree[x<<1].multag*tree[x].multag%p;
tree[x<<1|1].multag=tree[x<<1|1].multag*tree[x].multag%p;
tree[x<<1].addtag=tree[x<<1].addtag*tree[x].multag%p;
tree[x<<1|1].addtag=tree[x<<1|1].addtag*tree[x].multag%p;
tree[x<<1].sum=tree[x<<1].sum*tree[x].multag%p;
tree[x<<1|1].sum=tree[x<<1|1].sum*tree[x].multag%p;
tree[x].multag=1;
}
if(tree[x].addtag!=0)
{
int mid=l+r>>1;
tree[x<<1].addtag+=tree[x].addtag;
tree[x<<1].addtag%=p;
tree[x<<1|1].addtag+=tree[x].addtag;
tree[x<<1|1].addtag%=p;
tree[x<<1].sum+=(mid-l+1)*tree[x].addtag;
tree[x<<1].sum%=p;
tree[x<<1|1].sum+=(r-mid)*tree[x].addtag;
tree[x<<1|1].sum%=p;
tree[x].addtag=0;
}
return;
}
void mul(int lq,int rq,int q,int l,int r,int x)
{
if(lq<=l&&rq>=r)
{
tree[x].multag=tree[x].multag*q%p;
tree[x].addtag=tree[x].multag*q%p;
tree[x].sum*=q;
return;
}
pushdown(x,l,r);
int mid=l+r>>1;
if(lq<=mid)
mul(lq,rq,q,l,mid,x<<1);
if(rq>mid)
mul(lq,rq,q,mid+1,r,x<<1|1);
tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%p;
return;
}
void add(int lq,int rq,int q,int l,int r,int x)
{
if(lq<=l&&rq>=r)
{
tree[x].addtag+=q;
tree[x].sum+=(r-l+1)*q%p;
return;
}
pushdown(x,l,r);
int mid=l+r>>1;
if(lq<=mid)
add(lq,rq,q,l,mid,x<<1);
if(rq>mid)
add(lq,rq,q,mid+1,r,x<<1|1);
tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%p;
return;
}
int query(int lq,int rq,int l,int r,int x)
{
if(lq<=l&&rq>=r)
return tree[x].sum;
pushdown(x,l,r);
int mid=l+r>>1,ans=0;
if(lq<=mid)
ans+=(query(lq,rq,l,mid,x<<1)%p);
if(rq>mid)
ans+=(query(lq,rq,mid+1,r,x<<1|1)%p);
//tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%p;
return ans;
}
int main()
{
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(1,1,n);
while(m--)
{
int op,x,y,k;
scanf("%d%d%d",&op,&x,&y);
if(op==1)
{
scanf("%d",&k);
mul(x,y,k,1,n,1);
}
if(op==2)
{
scanf("%d",&k);
add(x,y,k,1,n,1);
}
if(op==3)
printf("%d\n",query(x,y,1,n,1)%p);
}
return 0;
}
```cpp