#include<bits/stdc++.h>
using namespace std;
long long n,q,mod;
long long a[100005];
long long tree[400005];
long long tag[400005];
long long mul[400005];
void build(long long l,long long r,long long p){
if(l==r){
tree[p]=a[l];
return;
}
build(l,l+(r-l)/2,p*2);
build(l+(r-l)/2+1,r,p*2+1);
tree[p]=tree[p*2]+tree[p*2+1];
return;
}
void add(long long l,long long r,long long userl,long long userr,long long plus,long long place){
if(l<=userl && r>=userr){
tree[place]+=(r-l+1)*plus; tree[place]%=mod;
tag[place]+=(r-l+1)*plus; return;
}
if(tag[place]!=0){
tree[place*2]+=tag[place]*(r-l+1); tree[place*2+1]=tag[place]*(r-l+1);
tree[place*2]%=mod; tree[place*2+1]%=mod;
tag[place*2]+=tag[place]; tag[place*2+1]+=tag[place]; tag[place]=0;
}
long long mid=userl+(userr-userl)/2;
if(l<=mid) add(l,r,userl,mid,plus,place*2);
if(r>mid) add(l,r,mid+1,userr,plus,place*2+1);
tree[place]=tree[place*2]+tree[place*2+1];
tree[place]%=mod;
return;
}
void multification(long long l,long long r,long long userl,long long userr,long long k,long long place){
if(l<=userl && r>=userr){
tree[place]*=k;
tree[place]%=mod;
mul[place]+=k; return;
}
if(mul[place]!=0){
tree[place*2]*=mul[place]; tree[place*2+1]*=mul[place];
tree[place*2]%=mod; tree[place*2+1]%=mod;
mul[place*2]+=mul[place]; mul[place*2+1]+=mul[place]; mul[place]=0;
}
long long mid=userl+(userr-userl)/2;
if(l<=mid) multification(l,r,userl,mid,k,place*2);
if(r>mid) multification(l,r,mid+1,userr,k,place*2+1);
tree[place]=tree[place*2]+tree[place*2+1]; tree[place]%=mod;
return;
}
long long query(long long l,long long r,long long userl,long long userr,long long place){
if(l<=userl && r>=userr){
return tree[place]%mod;
}
if(tag[place]!=0){
tree[place*2]+=tag[place]*(r-l+1); tree[place*2+1]=tag[place]*(r-l+1);
tree[place*2]%=mod; tree[place*2+1]%=mod;
tag[place*2]+=tag[place]; tag[place*2+1]+=tag[place]; tag[place]=0;
}
if(mul[place]!=0){
tree[place*2]*=mul[place]; tree[place*2+1]*=mul[place];
tree[place*2]%=mod; tree[place*2+1]%=mod;
mul[place*2]+=mul[place]; mul[place*2+1]+=mul[place]; mul[place]=0;
}
long long sum=0;
long long mid=userl+(userr-userl)/2;
if(l<=mid) sum+=query(l,r,userl,mid,place*2),sum%=mod;
if(r>mid) sum+=query(l,r,mid+1,userr,place*2+1),sum%=mod;
return sum;
}
int main(){
scanf("%lld %lld %lld",&n,&q,&mod);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,n,1);
for(int i=1;i<=q;i++){
long long op; scanf("%lld",&op);
if(op==1){
long long x,y,k; scanf("%lld %lld %lld",&x,&y,&k);
multification(x,y,1,n,k,1);
}else if(op==2){
long long x,y,k; scanf("%lld %lld %lld",&x,&y,&k);
add(x,y,1,n,k,1);
}else if(op==3){
long long x,y; scanf("%%lld %lld",&x,&y);
cout<<query(x,y,1,n,1)<<"\n";
}
}
return 0;
}
眼睛看花了