感觉没有写错的地方但是全RE,样例和第一个点都能过
#include<cstdio>
#define ll long long
using namespace std;
ll n,m,num[100008],tree[3000005],op,lazy[3000005],lazy2[3000005],Mod;
void build(int u,int l,int r)
{
lazy2[u]=1;
if(l==r)
{
tree[u]=num[l];
return ;
}
int mid=(l+r)>>1;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
tree[u]=tree[u*2]+tree[u*2+1];
tree[u]%=Mod;
// printf("(%d,%d,%d)",l,r,tree[u]);
}
bool inrange(int l,int r,int L,int R)
{
return l>=L&&r<=R;
}
bool outrange(int l,int r,int L,int R)
{
return l>R||r<L;
}
void maketag(int u,int l,int r,ll k)
{
tree[u]=(tree[u]+(r-l+1)*k)%Mod;
lazy[u]=(k+lazy[u])%Mod;
}
void maketag2(int u,int l,int r,ll k)
{
tree[u]=tree[u]*k%Mod;
lazy[u]=lazy[u]*k%Mod;
lazy2[u]=lazy2[u]*k%Mod;
}
void pushdown(int u,int l,int r)
{
if(l!=r)
{
int mid=(l+r)>>1;
maketag2(u*2,l,mid,lazy2[u]);
maketag2(u*2+1,mid+1,r,lazy2[u]);
maketag(u*2,l,mid,lazy[u]);
maketag(u*2+1,mid+1,r,lazy[u]);
}
lazy[u]=0;lazy2[u]=1;
}
void update(int u,int L,int R,int l,int r,ll k)
{
if(inrange(l,r,L,R))
{
// printf("(%d,%d,%d)",l,r,tree[u]);
maketag(u,l,r,k);
// printf("(%d,%d,%d)",l,r,tree[u]);
return;
}
else if(!outrange(l,r,L,R))
{
int mid=(l+r)>>1;
if(lazy2[u]!=1||lazy[u])
{
pushdown(u,l,r);
}
update(u*2,L,R,l,mid,k);
update(u*2+1,L,R,mid+1,r,k);
tree[u]=tree[u*2]+tree[u*2+1];
}
}
void update2(int u,int L,int R,int l,int r,ll k)
{
if(inrange(l,r,L,R))
{
maketag2(u,l,r,k);
return;
}
else if(!outrange(l,r,L,R))
{
int mid=(l+r)>>1;
if(lazy2[u]!=1||lazy[u])
{
pushdown(u,l,r);
}
update2(u*2,L,R,l,mid,k);
update2(u*2+1,L,R,mid+1,r,k);
tree[u]=tree[u*2]+tree[u*2+1];
}
}
ll query(int u,int L,int R,int l,int r)
{
// printf("(%d,%d,%d)",l,r,tree[u]);
if(inrange(l,r,L,R))
return tree[u];
else if(!outrange(l,r,L,R))
{
if(lazy[u]||lazy2[u]!=1)
pushdown(u,l,r);
int mid=(l+r)>>1;
return query(u*2,L,R,l,mid)+query(u*2+1,L,R,mid+1,r);
}
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&Mod);
for(int a=1;a<=n;a++)
{
scanf("%lld",&num[a]);
}
build(1,1,n);
while(m--)
{
scanf("%d",&op);
if(op==2)
{
int l,r,d;
scanf("%d%d%d",&l,&r,&d);
update(1,l,r,1,n,d);
}
else if(op==1)
{
int l,r,d;
scanf("%d%d%d",&l,&r,&d);
update2(1,l,r,1,n,d);
}
else
{
int l,r;
scanf("%d%d",&l,&r);
printf("%lld\n",query(1,l,r,1,n)%Mod);
}
}
return 0;
}