#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+3;
int a[maxn];
struct node{
ll sum,la1,la2;
bool lc;
}tree[maxn<<2];
ll n,m,Q;
void up(int k){
tree[k].sum=(tree[k<<1].sum+tree[k<<1|1].sum)%m;
return;
}
void down(int k,int na,int nb){
if(tree[k].lc==1){
tree[k<<1].sum=(tree[k<<1].sum*tree[k].la2)%m;
tree[k<<1].la1=(tree[k<<1].la1*tree[k].la2)%m;
if(tree[k<<1].lc==1){
tree[k<<1].la2=(tree[k<<1].la2*tree[k].la2)%m;
}else{
tree[k<<1].la2=tree[k].la2;
tree[k<<1].lc=true;
}
tree[k<<1|1].sum=(tree[k<<1|1].sum*tree[k].la2)%m;
tree[k<<1].la1=(tree[k<<1|1].la1*tree[k].la2)%m;
if(tree[k<<1|1].lc==1){
tree[k<<1|1].la2=(tree[k<<1|1].la2*tree[k].la2)%m;
}else{
tree[k<<1|1].la2=tree[k].la2;
tree[k<<1|1].lc=true;
}
tree[k].lc=0;
tree[k].lc=0;
}
if(tree[k].la1!=0){
tree[k<<1].sum=(na*tree[k].la1+tree[k<<1].sum)%m;
tree[k<<1].la1=(tree[k].la1+tree[k<<1].la1)%m;
tree[k<<1|1].sum=(nb*tree[k].la1+tree[k<<1|1].sum)%m;
tree[k<<1|1].la1=(tree[k<<1|1].la1+tree[k].la1)%m;
tree[k].la1=0;
}
}
void build(int l,int r,int k){
if(l==r){
tree[k].sum=a[l];
return;
}
int M=(l+r)>>1;
build(l,M,k<<1);
build(M+1,r,k<<1|1);
up(k);
}
void add(int ql,int qr,int c,int l,int r,int k){
if(ql<=l&&qr>=r){
tree[k].sum=(tree[k].sum+((r-l+1)*c)%m)%m;
tree[k].la1=(tree[k].la1+c)%m;
return;
}
int M=(l+r)>>1;
down(k,m-l+1,r-M);
if(ql<=M) add(ql,qr,c,l,M,k<<1);
if(qr>M)add(ql,qr,c,M+1,r,k<<1|1);
up(k);
}
int q(int ql,int qr,int l,int r,int k){
if(ql>=l&&qr<=r){
return tree[k].sum;
}
ll ans=0;
int M=(l+r)>>1;
down(k,M-l+1,r-M);
if(ql<=M)ans+=q(ql,qr,l,M,k<<1);
if(qr>M)ans+=q(ql,qr,M+1,r,k<<1|1);
up(k);
return ans;
}
void mul(int ql,int qr,int c,int l, int r,int k){
if(ql<=l&&qr>=r){
tree[k].sum=((ll)tree[k].sum*c)%m;
tree[k].la1=((ll)tree[k].la1*c)%m;
if(tree[k].lc==1){
tree[k].la2=((ll)tree[k].la2*c)%m;
}else{
tree[k].la2=c;
tree[k].lc=true;
}
return ;
}
int M=(l+r)>>1;
down(k,M-l+1,r-M);
if(ql<=M) mul(ql,qr,c,l,M,k<<1);
if(qr>M) mul(ql,qr,c,M+1,r,k<<1|1);
up(k);
}
int main(){
cin>>n>>Q>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,n,1);
for(int i=1;i<=Q;i++){
int p;
cin>>p;
if(p==1){
int x,y,k;
cin>>x>>y>>k;
mul(x,y,k,1,n,1);
}else if(p==2){
int x,y,k;
cin>>x>>y>>k;
add(x,y,k,1,n,1);
}else{
int x,y;
cin>>x>>y;
cout<<q(x,y,1,n,1)<<endl;
}
}
return 0;
}