样例过了,但 0 pts 。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
ll n,m,p;
struct node
{
ll l,r;
ll num;
}tr[N*4];
ll a[N],lazy_plus[N*4],lazy_times[N*4];
void pushup(ll u)
{
tr[u].num=tr[u<<1].num%p+tr[u<<1|1].num%p;
}
void build(ll u,ll l,ll r)
{
lazy_plus[u]=0;
lazy_times[u]=1;
if(l==r)
{
tr[u].num=a[l];
tr[u].l=l;
tr[u].r=r;
}
else
{
tr[u].l=l;
tr[u].r=r;
ll mid=(l+r)/2;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
}
//点修改
//void modify(int u,int l,int r,int x,int k) //将编号为x的值加k
//{
// if(l==r)
// {
// tr[u].num=tr[u].num+k;
// }
// else
// {
// int mid=(l+r)/2;
// if(x<=mid) modify(u<<1,l,mid,x,k);
// if(x>mid) modify(u<<1,mid+1,r,x,k);
// pushup(u);
// }
//}
void pushdown(ll u,ll ln,ll rn)
{
// if(lazy[u])
// {
lazy_plus[u<<1]+=lazy_plus[u];lazy_plus[u<<1]%=p;
lazy_plus[u<<1|1]+=lazy_plus[u];lazy_plus[u<<1|1]%=p;
tr[u<<1].num+=lazy_plus[u]*ln;tr[u<<1].num%=p;
tr[u<<1|1].num+=lazy_plus[u]*rn;tr[u<<1|1].num%=p;
lazy_plus[u]=0;
lazy_times[u<<1]*=lazy_times[u];
lazy_times[u<<1|1]*=lazy_times[u];
tr[u<<1].num*=lazy_times[u];
tr[u<<1|1].num*=lazy_times[u];
lazy_times[u]=1;
// }
}
void modify_plus(ll u,ll L,ll R,ll k)
{
if(tr[u].l>=L&&tr[u].r<=R)
{
tr[u].num+=(tr[u].r-tr[u].l+1)*k;
tr[u].num%=p;
lazy_plus[u]+=k;
lazy_plus[u]%=p;
}
else
{
ll mid=(tr[u].l+tr[u].r)/2;
pushdown(u,mid-tr[u].l+1,tr[u].r-mid);
if(L<=mid) modify_plus(u<<1,L,R,k);
if(R>mid) modify_plus(u<<1|1,L,R,k);
pushup(u);
}
}
void modify_times(ll u,ll L,ll R,ll k)
{
ll mid=(tr[u].l+tr[u].r)/2;
if(tr[u].l>=L&&tr[u].r<=R)
{
pushdown(u,mid-tr[u].l+1,tr[u].r-mid);
tr[u].num*=k;
lazy_times[u]*=k;
}
else
{
pushdown(u,mid-tr[u].l+1,tr[u].r-mid);
if(L<=mid) modify_times(u<<1,L,R,k);
if(R>mid) modify_times(u<<1|1,L,R,k);
pushup(u);
}
}
ll query(ll u,ll L,ll R)
{
if(tr[u].l>=L&&tr[u].r<=R)
{
return tr[u].num;
}
ll mid=(tr[u].l+tr[u].r)/2;
pushdown(u,mid-tr[u].l+1,tr[u].r-mid);
ll ans=0;
if(L<=mid) ans+=query(u<<1,L,R)%p;
if(R>mid) ans+=query(u<<1|1,L,R)%p;
return ans%p;
}
int main()
{
cin>>n>>m>>p;
for(ll i=1;i<=n;i++)
{
cin>>a[i];
// lazy_times[i*4-3]=1;
// lazy_times[i*4-2]=1;
// lazy_times[i*4-1]=1;
// lazy_times[i*4]=1;
}
build(1,1,n);
ll op,x,y,k;
while(m--)
{
cin>>op;
if(op==1)
{
cin>>x>>y>>k;
modify_times(1,x,y,k);
}
if(op==2)
{
cin>>x>>y>>k;
modify_plus(1,x,y,k);
}
else if(op==3)
{
cin>>x>>y;
cout<<query(1,x,y)%p<<"\n";
}
}
return 0;
}