似乎与题解首页没有大区别,望各位大佬讲解
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll M=1e5+5;
ll n,q,mod,a[M<<2],t[M<<2];
ll add[M<<2],mul[M<<2];
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
ll mim(ll pl,ll pr){return (pl+pr)>>1;}
void push_up(ll p)
{
t[p]=t[ls(p)]+t[rs(p)];
}
void build(ll p,ll pl,ll pr)
{
add[p]=0,mul[p]=1;
if(pl==pr)
{
t[p]=a[pl];
}
else
{
ll mid=mim(pl,pr);
build(ls(p),pl,mid);
build(rs(p),mid+1,pr);
push_up(p);
}
}
void multag(ll p,ll k)
{
a[p]=(a[p]*k)%mod;
mul[p]=(mul[p]*k)%mod;
add[p]=(add[p]*k)%mod;
}
void addtag(ll p,ll pl,ll pr,ll k)
{
a[p]=(a[p]+k*(pr-pl+1))%mod;
add[p]=(add[p]+k)%mod;
}
void push_down(ll p,ll pl,ll pr)
{
ll mid=mim(pl,pr),l=ls(p),r=rs(p);
a[l]=(a[l]*mul[p]+add[p]*(mid-l+1))%mod;
a[r]=(a[r]*mul[p]+add[p]*(r-mid))%mod;
mul[l]=(mul[l]*mul[p])%mod;
mul[r]=(mul[r]*mul[p])%mod;
add[l]=(add[l]*mul[p]+add[p])%mod;
add[r]=(add[r]*mul[p]+add[p])%mod;
add[p]=0,mul[p]=1;
}
//update mul
void um(ll p,ll pl,ll pr,ll l,ll r,ll k)
{
if(l<=pl&&pr<=r)
{
multag(p,k);
}
else
{
push_down(p,pl,pr);
ll mid=mim(pl,pr);
if(l<=mid) um(ls(p),pl,mid,l,r,k);
if(r>mid) um(rs(p),mid+1,pr,l,r,k);
push_up(p);
}
}
//update add
void ua(ll p,ll pl,ll pr,ll l,ll r,ll k)
{
if(l<=pl&&pr<=r)
{
addtag(p,pl,pr,k);
}
else
{
push_down(p,pl,pr);
ll mid=mim(pl,pr);
if(l<=mid) ua(ls(p),pl,mid,l,r,k);
if(r>mid) ua(rs(p),mid+1,pr,l,r,k);
push_up(p);
}
}
ll sum(ll p,ll pl,ll pr,ll l,ll r)
{
if(l<=pl&&pr<=r)
{
return t[p];
}
else
{
push_down(p,pl,pr);
ll ans=0;
ll mid=mim(pl,pr);
if(l<=mid) ans+=sum(ls(p),pl,mid,l,r);
if(r>mid) ans+=sum(rs(p),mid+1,pr,l,r);
return ans;
}
}
int main()
{
cin>>n>>q>>mod;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
while(q--)
{
ll op,x,y,k;
cin>>op>>x>>y;
if(op==1)
{
cin>>k;
um(1,1,n,x,y,k);
}
else if(op==2)
{
cin>>k;
ua(1,1,n,x,y,k);
}
else
{
cout<<sum(1,1,n,x,y)<<endl;
}
}
return 0;
}