#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*f;
}
#define int long long
#define ls x<<1
#define rs x<<1|1
struct h{
int l,r,val,lac,laj;
};
int mod;
h tree[400005];
int a[100005];
void build(int x,int l,int r){
tree[x].l=l;
tree[x].r=r;
tree[x].lac=1;
tree[x].laj=0;
if(l==r){
tree[x].val=a[l];
tree[x].val%=mod;
return;
}
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
tree[x].val=(tree[ls].val+tree[rs].val)%mod;
}
void pushdown(int x){
tree[ls].val=(tree[x].lac*tree[ls].val+(tree[x].laj*(tree[ls].r-tree[ls].l+1)))%mod;
tree[rs].val=(tree[x].lac*tree[rs].val+(tree[x].laj*(tree[rs].r-tree[rs].l+1)))%mod;
tree[ls].lac=(tree[x].lac*tree[ls].lac)%mod;
tree[rs].lac=(tree[x].lac*tree[rs].lac)%mod;
tree[ls].laj=(tree[ls].laj*tree[x].lac+tree[x].laj)%mod;
tree[rs].laj=(tree[rs].laj*tree[x].lac+tree[x].laj)%mod;
tree[x].lac=1;
tree[x].laj=0;
}
void change1(int x,int l,int r,int k){
if(tree[x].r<l||tree[x].l>r){
return ;
}
if(tree[x].l>=l&&tree[x].r<=r){
tree[x].val=(tree[x].val*k)%mod;
tree[x].lac=(tree[x].lac*k)%mod;
tree[x].laj=(tree[x].laj*k)%mod;
return;
}
pushdown(x);
int mid=(tree[x].l+tree[x].r)>>1;
change1(ls,l,mid,k);
change1(rs,mid,r,k);
tree[x].val=(tree[ls].val+tree[rs].val)%mod;
}
void change2(int x,int l,int r,int k){
if(tree[x].r<l||tree[x].l>r){
return ;
}
if(tree[x].l>=l&&tree[x].r<=r){
tree[x].val=(tree[x].val+(k*(tree[x].r-tree[x].l+1)))%mod;
tree[x].laj=(tree[x].laj+k)%mod;
return;
}
int mid=(tree[x].l+tree[x].r)>>1;
pushdown(x);
change2(ls,l,mid,k);
change2(rs,mid+1,r,k);
tree[x].val=(tree[ls].val+tree[rs].val)%mod;
}
int query(int x,int l,int r){
if(tree[x].r<l||tree[x].l>r){
return 0;
}
if(tree[x].l>=l&&tree[x].r<=r){
return tree[x].val;
}
int mid=(tree[x].l+tree[x].r)>>1;
int res=0;
pushdown(x);
res+=query(ls,l,mid)%mod,res%=mod;
res+=query(rs,mid+1,r)%mod,res%=mod;
return res;
}
int n,m;
signed main(){
cin>>n>>m>>mod;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
for(int i=1;i<=m;i++){
int op;
int x,y,z;
cin>>op;
if(op==1){
cin>>x>>y>>z;
change1(1,x,y,z);
}
else if(op==2){
cin>>x>>y>>z;
change2(1,x,y,z);
}
else{
cin>>x>>y;
cout<<query(1,x,y)%mod<<"\n";
}
}
return 0;
}
变量解释:
laj:加法懒标记
lac:乘法懒标记
改了两小时了求大佬帮忙看看吧 QAQ