代码如下
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
#define int long long
int n,a[N],T[N<<2],n1,z,z1,b,c,tage[N<<2],tage_x[N<<2];
long long ans1;
void build(int l,int r,int k){
if(l==r){
T[k]=a[l];
return ;
}
int mid=(l+r)/2;
build(l,mid,k*2);
build(mid+1,r,k*2+1);
T[k]=T[k*2]+T[k*2+1];
}
void pushdown(int l,int r,int k){
int len=r-l+1;
int t = tage[k];
T[k]+=len*t;
tage[k*2]+=t;
tage[k*2+1]+=t;
tage[k]=0;
}
void pushdown_x(int l,int r,int k){
int t = tage_x[k];
T[k]=T[k]*t;
tage_x[k*2]+=t;
tage_x[k*2+1]+=t;
tage_x[k]=0;
}
void add(int l,int r,int k,int x,int y,int t){
pushdown(l,r,k);
pushdown_x(l,r,k);
if(x<=l&&r<=y){
tage[k]+=t;
pushdown_x(l,r,k);
pushdown(l,r,k);
return;
}
if(r<x||y<l){
return ;
}
int mid=(l+r)/2;
add(l,mid,k*2,x,y,t);
add(mid+1,r,k*2+1,x,y,t);
T[k]=T[k*2]+T[k*2+1];
}
void mult(int l,int r,int k,int x,int y,int t){
pushdown_x(l,r,k);
pushdown(l,r,k);
if(x<=l&&r<=y){
tage_x[k]+=t;
pushdown_x(l,r,k);
pushdown(l,r,k);
return;
}
if(r<x||y<l){
return ;
}
int mid=(l+r)/2;
mult(l,mid,k*2,x,y,t);
mult(mid+1,r,k*2+1,x,y,t);
T[k]=T[k*2]+T[k*2+1];
}
int sum(int l,int r,int k,int x,int y){
int ans;
pushdown_x(l,r,k);
pushdown(l,r,k);
if(x<=l&&r<=y){
return T[k];
}
if(r<x||y<l){
return 0;
}
int mid=(l+r)/2;
ans=sum(l,mid,k*2,x,y)+sum(mid+1,r,k*2+1,x,y);
T[k]=T[k*2]+T[k*2+1];
return ans;
}
signed main(){
int m;
cin>>n>>n1>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
// return 0;
build(1,n,1);
for(int i=1;i<=n1;i++){
cin>>b;
if(b==1){
cin>>z>>z1>>c;
mult(1,n,1,z,z1,c);
// for(int i=1;i<=n;i++){
// cout<<a[i]<<" ";
// }
// cout<<endl;
}
else if(b==3){
cin>>z>>z1;
ans1=sum(1,n,1,z,z1);
ans1=ans1%m;
cout<<ans1<<endl;
}
else{
cin>>z>>z1>>c;
add(1,n,1,z,z1,c);
}
}
return 0;
}