#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 modw(k) t[k].w%=mod
using namespace std;
struct st{
int l,r,w,f,f2=1;
} 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;
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=t[2*k].w+t[2*k+1].w;
}
void down(int k){
t[2*k].w+=t[k].f*(t[2*k].r-t[2*k].l+1);
t[2*k+1].w+=t[k].f*(t[2*k+1].r-t[2*k+1].l+1);
modw(2*k);
modw(2*k+1);
t[2*k].f+=t[k].f;
t[2*k+1].f+=t[k].f;
t[k].f=0;
}
void down_mul(int k){
t[2*k].w*=t[k].f2;
modw(2*k);
t[2*k+1].w*=t[k].f2;
modw(2*k+1);
t[2*k].f2*=t[k].f2;
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].f)down(k);
int mid=m(k);
if(x<=mid)ans+=a_i(2*k,x,y);
if(y>mid)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+=add*(t[k].r-t[k].l+1);
t[k].f+=add;
return;
}
if(t[k].f2)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=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*=mul;
t[k].f*=mul;
t[k].f2*=mul;
return;
}
if(t[k].f2)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=t[2*k].w+t[2*k+1].w;
modw(k);
}
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)%mod<<endl;
}
}
return 0;
}