#include <bits/stdc++.h>
using namespace std;
long long d[401072],lazy[401072],lazyx[401072],c=0;
long long a[100010];
long long a1,b1,c1,d1;
long long n,m,mod;
void chen(long long s,long long t,long long l,long long r,long long p){
if(l>=s&&r<=t){
d[p]*=d1;
lazyx[p]*=d1;
return;
}
long long x=l+((r-l)>>1);
if(lazyx[p]!=1&&s!=t){
d[p*2]*=lazyx[p];
lazy[p*2]*=lazyx[p];
d[p*2+1]*=lazyx[p];
lazy[p*2+1]*=lazyx[p];
lazyx[p*2]*=lazyx[p];
lazyx[p*2+1]*=lazyx[p];
lazyx[p]=1;
}
if(lazy[p]!=0&&s!=t){
d[p*2]+=(x-l+1)*lazy[p];
lazy[p*2]+=lazy[p];
d[p*2+1]+=(r-x)*lazy[p];
lazy[p*2+1]+=lazy[p];
lazy[p]=0;
}
if(s<=x){
chen(s,t,l,x,p*2);
}
if(t>x){
chen(s,t,x+1,r,p*2+1);
}
d[p]=(d[p*2]+d[p*2+1])%mod;
}
long long find(long long s,long long t,long long l,long long r,long long p){
if(l>=s&&r<=t){
return d[p];
}
long long x=l+((r-l)>>1);
if(lazyx[p]!=1&&s!=t){
d[p*2]*=lazyx[p];
lazy[p*2]*=lazyx[p];
d[p*2+1]*=lazyx[p];
lazyx[p*2]*=lazyx[p];
lazyx[p*2+1]*=lazyx[p];
lazy[p*2+1]*=lazyx[p];
lazyx[p]=1;
}
if(lazy[p]!=0){
d[p*2]+=(x-l+1)*lazy[p];
lazy[p*2]+=lazy[p];
d[p*2+1]+=(r-x)*lazy[p];
lazy[p*2+1]+=lazy[p];
lazy[p]=0;
}
long long sum=0;
if(s<=x){
sum=find(s,t,l,x,p*2)%mod;
}
if(t>x){
sum+=find(s,t,x+1,r,p*2+1)%mod;
}
return sum;
}
void add(long long s,long long t,long long l,long long r,long long p){
if(l>=s&&r<=t){
d[p]+=(r-l+1)*d1;
lazy[p]+=d1;
return;
}
long long x=l+((r-l)>>1);
if(lazyx[p]!=1&&s!=t){
d[p*2]+=lazyx[p];
lazy[p*2]+=lazyx[p];
d[p*2+1]+=lazyx[p];
lazy[p*2+1]+=lazyx[p];
lazyx[p*2]*=lazyx[p];
lazyx[p*2+1]*=lazyx[p];
lazyx[p]=1;
}
if(lazy[p]!=0&&s!=t){
d[p*2]+=(x-l+1)*lazy[p];
lazy[p*2]+=lazy[p];
d[p*2+1]+=(r-x)*lazy[p];
lazy[p*2+1]+=lazy[p];
lazy[p]=0;
}
if(s<=x){
add(s,t,l,x,p*2);
}
if(t>x){
add(s,t,x+1,r,p*2+1);
}
d[p]=(d[p*2]+d[p*2+1])%mod;
}
void build(long long s,long long e,long long p){
if(s==e){
d[p]=a[s];
return;
}
long long x=s+((e-s)>>1);
build(s,x,p*2);
build(x+1,e,p*2+1);
d[p]=(d[p*2]+d[p*2+1])%mod;
}
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
scanf("%lld%lld%lld",&n,&m,&mod);
for(int i=1;i<=400000;i++){
lazyx[i]=1;
lazy[i]=0;
}
for(long long i=1;i<=n;i++){
scanf("%lld",&a[i]);
c+=a[i];
}
d[1]=c;
build(1,n,1);
for(long long i=1;i<=m;i++){
// int o=1,k=0;
// cout<<endl;
// for(long long i=1;i<=n*2-1;i++){
// cout<<d[i]<<" ";
// if(o==pow(2,k)){
// k++;
// o=0;
// cout<<endl;
// }
// o++;
// }
cout<<endl<<endl;
scanf("%lld%lld%lld",&a1,&b1,&c1);
if(a1==1){
scanf("%lld",&d1);
chen(b1,c1,1,n,1);
}
if(a1==2){
scanf("%lld",&d1);
add(b1,c1,1,n,1);
}
if(a1==3){
printf("%lld\n",find(b1,c1,1,n,1)%mod);
}
}
return 0;
}