在老师的指导下,我的码风渐渐失控(39-42行)
#include<bits/stdc++.h>
using namespace std;
#define N 100005
long long n,q,m,a[N],sum[N*4],add[N*4],mul[N*4];
void build(int k,int l,int r)
{
mul[k]=1;
if(l==r)
{
sum[k]=a[l]%m;
return;
}
int mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
sum[k]=(sum[k*2]%m+sum[k*2+1]%m)%m;
}
void adds(int k,int l,int r,int v)
{
sum[k]=(sum[k]%m+(r-l+1)*v%m)%m;
add[k]=(add[k]%m+v%m)%m;
}
void muls(int k,int l,int r,int v)
{
sum[k]=(sum[k]*v)%m;
/*if((mul[k]*v)%m!=0)*/mul[k]=(mul[k]*v)%m;
add[k]=(add[k]*v)%m;
}
void down(int k,int l,int r)
{
if(add[k]==0&&mul[k]==1)return;
int mid=(l+r)/2;
//adds(k*2+1,mid+1,r,add[k]);adds(k*2,l,mid,add[k]);
muls(k*2,l,mid,mul[k]);
muls(k*2+1,mid+1,r,mul[k]);mul[k]=1;adds(k*2+1,mid+1,r,add[k]);adds(k*2,l,mid,add[k]);
add[k]=0;
}
void Add_modify(int k,int l,int r,int x,int y,int v)
{
if(x>r||y<l)return;
if(x<=l&&y>=r)
{
adds(k,l,r,v);
return;
}
down(k,l,r);
int mid=(l+r)/2;
Add_modify(k*2,l,mid,x,y,v);
Add_modify(k*2+1,mid+1,r,x,y,v);
sum[k]=(sum[k*2]%m+sum[k*2+1]%m)%m;
}
void Mul_modify(int k,int l,int r,int x,int y,int v)
{
if(x>r||y<l)return;
if(x<=l&&y>=r)
{
muls(k,l,r,v);
return;
}
down(k,l,r);
int mid=(l+r)/2;
Mul_modify(k*2,l,mid,x,y,v);
Mul_modify(k*2+1,mid+1,r,x,y,v);
sum[k]=(sum[k*2]%m+sum[k*2+1]%m)%m;
}
long long query(int k,int l,int r,int x,int y)
{
if(x>r||y<l)return 0;
if(x<=l&&y>=r)return sum[k]%m;
down(k,l,r);
int mid=(l+r)/2;
return (query(k*2,l,mid,x,y)%m+query(k*2+1,mid+1,r,x,y)%m)%m;
}
int main()
{
scanf("%lld%lld%lld",&n,&q,&m);
for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
build(1,1,n);
while(q--)
{
int t;
scanf("%d",&t);
if(t==2)
{
int l,r,v;
scanf("%d%d%d",&l,&r,&v);
Add_modify(1,1,n,l,r,v%m);
}
else if(t==3)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%lld\n",query(1,1,n,x,y));
}
else
{
int l,r,v;
scanf("%d%d%d",&l,&r,&v);
Mul_modify(1,1,n,l,r,v);
}
}
return 0;
}
感觉问题像31行取余会有0