::::info[它俩看起来都一样,为什么前者对后者错] :::info[WA代码]
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
long long n,m,q,d[MAXN*4],b[MAXN*4],a[MAXN],c[MAXN*4];
void build(long long s,long long t,long long p)
{
if(s==t)
{
d[p]=a[s]%m;
return ;
}
long long mid=s+((t-s)>>1);
build(s,mid,p*2);
build(mid+1,t,p*2+1);
d[p]=(d[p*2]+d[p*2+1])%m;
}
void g(long long mid,long long p,long long s,long long t)
{
if(c[p]!=1)//&&s!=t
{
d[p*2]=(d[p*2]*c[p])%m;//先乘
d[p*2+1]=(d[p*2+1]*c[p])%m;
c[p*2]=(c[p*2]*c[p])%m;
c[p*2+1]=(c[p*2+1]*c[p])%m;
b[p*2]=(b[p*2]*c[p])%m;
b[p*2+1]=(b[p*2+1]*c[p])%m;
c[p]=1;
}
if(b[p])//&&s!=t
{
d[p*2]=(d[p*2]+(mid-s+1)*b[p])%m;//乘一次 余一次 %m
d[p*2+1]=(d[p*2+1]+(t-mid)*b[p])%m;//%m
b[p*2]=(b[p*2]+b[p])%m;
b[p*2+1]=(b[p*2+1]+b[p])%m;
b[p]=0;
}
}
void update(long long l,long long r,long long s,long long t,long long p,long long k)
{
if(l<=s&&t<=r)
{
d[p]=(d[p]*k)%m;
c[p]=(c[p]*k)%m;
b[p]=(c[p]*k)%m;
return ;
}
long long mid=s+((t-s)>>1);
g(mid,p,s,t);
if(l<=mid) update(l,r,s,mid,p*2,k);
if(r>mid) update(l,r,mid+1,t,p*2+1,k);//=+1
d[p]=(d[p*2]+d[p*2+1])%m;
}
void update2(long long l,long long r,long long s,long long t,long long p,long long k)
{
if(l<=s&&t<=r)
{
d[p]=(d[p]+k*(t-s+1))%m;
b[p]=(b[p]+k)%m;
return ;
}
long long mid=s+((t-s)>>1);
g(mid,p,s,t);
if(l<=mid) update2(l,r,s,mid,p*2,k);
if(r>mid) update2(l,r,mid+1,t,p*2+1,k);//=+1
d[p]=(d[p*2]+d[p*2+1])%m;
}
long long getsum(long long l,long long r,long long s,long long t,long long p)
{
if(l<=s&&t<=r) return d[p];
long long mid=s+((t-s)>>1),sum=0;
g(mid,p,s,t);
if(l<=mid) sum=(sum+getsum(l,r,s,mid,p*2))%m;
if(r>mid) sum=(sum+getsum(l,r,mid+1,t,p*2+1))%m;//=+1
return sum;
}
int main()
{
cin>>n>>q>>m;
for(int i=1;i<=n*4+10;i++) c[i]=1;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,n,1);
for(int i=1;i<=q;i++)
{
int z,x,y,k;
cin>>z>>x>>y;
if(z==1)
{
cin>>k;
update(x,y,1,n,1,k);
}
else if(z==2)
{
cin>>k;
update2(x,y,1,n,1,k);
}
else cout<<getsum(x,y,1,n,1)<<"\n";
}
return 0;
}
::: :::info[AC代码]
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
long long n,m,q,d[MAXN*4],b[MAXN*4],a[MAXN],c[MAXN*4];
void build(long long s,long long t,long long p) {
if(s==t) {
d[p]=a[s]%m;
return;
}
long long mid=s+((t-s)>>1);
build(s,mid,p*2);
build(mid+1,t,p*2+1);
d[p]=(d[p*2]+d[p*2+1])%m;
}
void push_down(long long p,long long s,long long t) {
long long mid=(s+t)>>1;
if(c[p]!=1) {
d[p*2]=(d[p*2]*c[p])%m;
d[p*2+1]=(d[p*2+1]*c[p])%m;
c[p*2]=(c[p*2]*c[p])%m;
c[p*2+1]=(c[p*2+1]*c[p])%m;
b[p*2]=(b[p*2]*c[p])%m;
b[p*2+1]=(b[p*2+1]*c[p])%m;
c[p]=1;
}
if(b[p]) {
d[p*2]=(d[p*2]+(mid-s+1)*b[p])%m;
d[p*2+1]=(d[p*2+1]+(t-mid)*b[p])%m;
b[p*2]=(b[p*2]+b[p])%m;
b[p*2+1]=(b[p*2+1]+b[p])%m;
b[p]=0;
}
}
void update_mul(long long l,long long r,long long s,long long t,long long p,long long k) {
if(l<=s&&t<=r) {
d[p]=(d[p]*k)%m;
c[p]=(c[p]*k)%m;
b[p]=(b[p]*k)%m;
return;
}
push_down(p,s,t);
long long mid=s+((t-s)>>1);
if(l<=mid) update_mul(l,r,s,mid,p*2,k);
if(r>mid) update_mul(l,r,mid+1,t,p*2+1,k);
d[p]=(d[p*2]+d[p*2+1])%m;
}
void update_add(long long l,long long r,long long s,long long t,long long p,long long k) {
if(l<=s&&t<=r) {
d[p]=(d[p]+k*(t-s+1))%m;
b[p]=(b[p]+k)%m;
return;
}
push_down(p,s,t);
long long mid=s+((t-s)>>1);
if(l<=mid) update_add(l,r,s,mid,p*2,k);
if(r>mid) update_add(l,r,mid+1,t,p*2+1,k);
d[p]=(d[p*2]+d[p*2+1])%m;
}
long long query(long long l,long long r,long long s,long long t,long long p) {
if(l<=s&&t<=r) return d[p];
push_down(p,s,t);
long long mid=s+((t-s)>>1),sum=0;
if(l<=mid) sum=(sum+query(l,r,s,mid,p*2))%m;
if(r>mid) sum=(sum+query(l,r,mid+1,t,p*2+1))%m;
return sum;
}
int main() {
cin>>n>>q>>m;
for(int i=1;i<=n*4;i++) c[i]=1;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,n,1);
while(q--) {
int op,x,y,k;
cin>>op>>x>>y;
if(op==1) {
cin>>k;
update_mul(x,y,1,n,1,k);
} else if(op==2) {
cin>>k;
update_add(x,y,1,n,1,k);
} else {
cout<<query(x,y,1,n,1)<<"\n";
}
}
return 0;
}
::: 有帮助必关 ::::