#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
ll n,m,a[200005],c,op1,op2,op3,p;
struct node
{
ll l,r,s,del,col;
}tr[2000100];
void pushup(ll u)
{
tr[u].s=(tr[u<<1].s+tr[u<<1|1].s)%p;
}
void pushdown(ll u,ll l,ll r)
{
ll mid=l+r>>1;
tr[u<<1].s=(tr[u<<1].s*tr[u].col)%p;
tr[u<<1|1].s=(tr[u<<1|1].s*tr[u].col)%p;
tr[u<<1].col=(tr[u<<1].col*tr[u].col)%p;
tr[u<<1|1].col=(tr[u<<1|1].col*tr[u].col)%p;
tr[u].col=1;
tr[u<<1].s=(tr[u<<1].s+(mid-l+1)*tr[u].del)%p;
tr[u<<1|1].s=(tr[u<<1|1].s+(r-mid)*tr[u].del)%p;
tr[u<<1].del=(tr[u<<1].del+tr[u].del)%p;
tr[u<<1|1].del=(tr[u<<1|1].del+tr[u].del)%p;
tr[u].del=0;
}
void build(ll u,ll l,ll r)
{
tr[u].l=l;
tr[u].r=r;
tr[u].col=1;
if(l==r)
{
tr[u].s=a[l];
return;
}
ll mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void modify1(ll u,ll x,ll y,ll v)
{
ll l=tr[u].l,r=tr[u].r;
if(x<=l && r<=y)
{
tr[u].s=(tr[u].s+(r-l+1)*v%p)%p;
tr[u].del=(tr[u].del+v)%p;
return;
}
ll mid=l+r>>1;
pushdown(u,l,r);
if(x<=mid) modify1(u<<1,x,y,v);
if(y>mid) modify1(u<<1|1,x,y,v);
pushup(u);
}
void modify2(ll u,ll x,ll y,ll v)
{
ll l=tr[u].l,r=tr[u].r;
if(x<=l && r<=y)
{
tr[u].s=(tr[u].s*v)%p;
tr[u].col=(tr[u].col*v)%p;
return;
}
ll mid=l+r>>1;
pushdown(u,l,r);
if(x<=mid) modify2(u<<1,x,y,v);
if(y>mid) modify2(u<<1|1,x,y,v);
pushup(u);
}
ll getsum(ll u,ll x,ll y)
{
ll l=tr[u].l,r=tr[u].r;
if(x<=l && r<=y) return tr[u].s%p;
ll mid=l+r>>1,sum=0;
pushdown(u,l,r);
if(x<=mid) sum=(sum+getsum(u<<1,x,y)%p)%p;
if(y>mid) sum=(sum+getsum(u<<1|1,x,y)%p)%p;
return sum%p;
}
int main()
{
cin>>n>>m>>p;
for(ll i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
build(1,1,n);
for(ll i=1;i<=m;i++)
{
cin>>c;
if(c==2)
{
scanf("%lld%lld%lld",&op1,&op2,&op3);
modify1(1,op1,op2,op3);
}
if(c==3)
{
scanf("%lld%lld",&op1,&op2);
printf("%lld\n",getsum(1,op1,op2));
}
if(c==1)
{
scanf("%lld%lld%lld",&op1,&op2,&op3);
modify2(1,op1,op2,op3);
}
}
return 0;
}
样例过了,结果一提交WAqwq,改了一上午了
col指乘积传递数组,del指和传递数组
本人蒟蒻qwq正在啃线段树
求大佬指出错误qwq Orz