感觉 push_down 写错了。
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void fio(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
int ls(int x){
return x<<1;
}
int rs(int x){
return x<<1|1;
}
int n,m;
const int N=1e5+5;
int mod;
int a[N],tree[N<<2],tag1[N<<2],tag2[N<<2];
void push_up(int p){
tree[p]=(tree[ls(p)]+tree[rs(p)])%mod;
}
void build(int p,int pl,int pr){
tag1[p]=0;
tag2[p]=1;
if (pl==pr){
tree[p]=a[pl];
return ;
}
int mid=(pl+pr)>>1;
build(ls(p),pl,mid);
build(rs(p),mid+1,pr);
push_up(p);
}
void addtag1(int p,int pl,int pr,int d){
tag1[p]+=d;
tag1[p]%=mod;
tree[p]+=d*(pr-pl+1);
tree[p]%=mod;
}
void addtag2(int p,int pl,int pr,int d){
tag1[p]*=d;
tag1[p]%=mod;
tag2[p]*=d;
tag2[p]%=mod;
tree[p]*=d;
tree[p]%=mod;
}
void push_down(int p,int pl,int pr){
int mid=(pl+pr)>>1;
addtag2(ls(p),pl,mid,tag2[p]%mod);
addtag2(rs(p),mid+1,pr,tag2[p]%mod);
addtag1(ls(p),pl,mid,tag1[p]*tag2[p]%mod);
addtag1(rs(p),mid+1,pr,tag1[p]*tag2[p]%mod);
tag1[p]=0;
tag2[p]=1;
}
void update1(int l,int r,int p,int pl,int pr,int d){
if (l<=pl&&pr<=r){
addtag1(p,pl,pr,d);
return ;
}
push_down(p,pl,pr);
push_up(p);
int mid=(pl+pr)>>1;
if (l<=mid){
update1(l,r,ls(p),pl,mid,d);
}
if (r>mid){
update1(l,r,rs(p),mid+1,pr,d);
}
push_up(p);
}
void update2(int l,int r,int p,int pl,int pr,int d){
if (l<=pl&&pr<=r){
addtag2(p,pl,pr,d);
return ;
}
push_down(p,pl,pr);
push_up(p);
int mid=(pl+pr)>>1;
if (l<=mid){
update2(l,r,ls(p),pl,mid,d);
}
if (r>mid){
update2(l,r,rs(p),mid+1,pr,d);
}
push_up(p);
}
int query(int l,int r,int p,int pl,int pr){
if (l<=pl&&pr<=r){
return tree[p];
}
push_down(p,pl,pr);
int ans=0;
int mid=(pl+pr)>>1;
if (l<=mid){
ans+=query(l,r,ls(p),pl,mid);
ans%=mod;
}
if (r>mid){
ans+=query(l,r,rs(p),mid+1,pr);
ans%=mod;
}
return ans;
}
signed main(){
fio();
cin>>n>>m>>mod;
for (int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while (m--){
int opt;
cin>>opt;
int x,y,k;
if (opt==1){
cin>>x>>y>>k;
update2(x,y,1,1,n,k);
}
else if(opt==2){
cin>>x>>y>>k;
update1(x,y,1,1,n,k);
}
else{
cin>>x>>y;
cout<<query(x,y,1,1,n)<<endl;
}
}
return 0;
}