#include<bits/stdc++.h>
#define m(k) (t[k].l+t[k].r)>>1
#define ini(x,y,k) x<=t[k].l && y>=t[k].r
#define mod(w) w%mod
using namespace std;
struct st{
long long l,r,w,f,f2;
} t[100100*4];
int mod;
void bu(int,int,int);
void down_mul(int);
void down(int);
long long a_i(int,int,int);
void a_d(int,int,int,int);
void m_l(int,int,int,int);
void bu(int k,int ll,int rr){
t[k].l=ll,t[k].r=rr,t[k].f2=1;
if(ll==rr){
cin>>t[k].w;
return;
}
int mid=m(k);
bu(2*k,ll,mid);
bu(2*k+1,mid+1,rr);
t[k].w=mod(t[2*k].w+t[2*k+1].w);
}
void down(int k){
t[2*k].w=mod(t[2*k].w+t[k].f*(t[2*k].r-t[2*k].l+1));
t[2*k+1].w=mod(t[2*k+1].w+t[k].f*(t[2*k+1].r-t[2*k+1].l+1));
t[2*k].f=mod(t[2*k].f+t[k].f);
t[2*k+1].f=mod(t[2*k+1].f+t[k].f);
t[k].f=0;
}
void down_mul(int k){
t[2*k].w=mod(t[2*k].w*t[k].f2);
t[2*k+1].w=mod(t[2*k+1].w*t[k].f2);
t[2*k].f2=mod(t[2*k].f2*t[k].f2);
t[2*k+1].f2=mod(t[2*k+1].f2*t[k].f2);
t[k].f2=1;
}
long long a_i(int k,int x,int y){
if(ini(x,y,k))return t[k].w;
long long ans=0;
if(t[k].f2!=1)down_mul(k);
if(t[k].f)down(k);
int mid=m(k);
if(x<=mid)ans=mod(ans+a_i(2*k,x,y));
if(y>mid)ans=mod(ans+a_i(2*k+1,x,y));
ans%=mod;
return ans;
}
void a_d(int k,int x,int y,int add){
if(ini(x,y,k)){
t[k].w=mod(t[k].w+add*(t[k].r-t[k].l+1));
t[k].f=mod(t[k].f+add);
return;
}
if(t[k].f2!=1)down_mul(k);
if(t[k].f)down(k);
int mid=m(k);
if(x<=mid)a_d(2*k,x,y,add);
if(y>mid)a_d(2*k+1,x,y,add);
t[k].w=mod(t[2*k].w+t[2*k+1].w);
}
void m_l(int k,int x,int y,int mul){
if(ini(x,y,k)){
t[k].w=mod(t[k].w*mul);
t[k].f=mod(t[k].f*mul);
t[k].f2=mod(t[k].f2*mul);
return;
}
if(t[k].f2!=1)down_mul(k);
if(t[k].f)down(k);
int mid=m(k);
if(x<=mid)m_l(2*k,x,y,mul);
if(y>mid)m_l(2*k+1,x,y,mul);
t[k].w=mod(t[2*k].w+t[2*k+1].w);
}
int main(){
int n,m;
cin>>n>>m>>mod;
bu(1,1,n);
while(m--){
int s,x,y;
cin>>s>>x>>y;
if(s==1){
int mul;
cin>>mul;
m_l(1,x,y,mul);
}
if(s==2){
int add;
cin>>add;
a_d(1,x,y,add);
}
if(s==3){
cout<<a_i(1,x,y)<<endl;
}
}
return 0;
}