#include<bits/stdc++.h>
#define lp p<<1
#define rp p<<1|1
using namespace std;
const int N=1e5+10;
long long n,a[N],m,l,r,q,x,s,y,k,cnt=0;
struct tree{
int l,r,sum,mul,add;
}tr[4*N];
void up(int p){
tr[p].sum=(tr[lp].sum+tr[rp].sum)%m;
}
void down(int p){
if(tr[p].add){
tr[lp].sum=((tr[lp].r-tr[lp].l+1)*tr[p].add%m+tr[lp].sum*tr[p].mul)%m;
tr[rp].sum=((tr[rp].r-tr[rp].l+1)*tr[p].add%m+tr[rp].sum*tr[p].mul)%m;
tr[lp].mul=tr[lp].mul*tr[p].mul%m;
tr[rp].mul=tr[rp].mul*tr[p].mul%m;
tr[rp].add=(tr[rp].add*tr[p].mul+tr[p].add)%m;
tr[lp].add=(tr[lp].add*tr[p].mul+tr[p].add)%m;
tr[p].mul=1;
tr[p].add=0;
}
}
void build(int l,int r,int p){
tr[p]={l,r,0,1,0};
if(l==r){
tr[p].sum=a[p];
return;
}
int m=l+r>>1;
build(l,m,lp);
build(m+1,r,rp);
up(p);
}
void cheng(int l,int r,int k,int p){
if(tr[p].l<l||tr[p].r>r){
return ;
}
if(tr[p].l>=l&&tr[p].r<=r){
tr[p].mul*=k;
tr[p].add*=k;
tr[p].sum*=k;
return;
}
int m=(tr[p].l+tr[p].r)>>1;
down(p);
if(x<=m){
cheng(l,r,k,lp);
}
if(y>m){
cheng(l,r,k,rp);
}
up(p);
}
void jia(int l,int r,int k,int p){
if(tr[p].l<l||tr[p].r>r){
return ;
}
if(tr[p].l>=l&&tr[p].r<=r){
tr[p].sum+=(tr[p].r-tr[p].l+1)*k;
tr[p].add+=k;
return;
}
int m=(tr[p].l+tr[p].r)>>1;
down(p);
if(x<=m){
jia(l,r,k,lp);
}
if(y>m){
jia(l,r,k,rp);
}
up(p);
}
int shu(int x,int y,int p){
if(l<=tr[p].l&&r>=tr[p].r){
return tr[p].sum;
}
int m=tr[p].l+tr[p].r>>1;
int cnt=0;
if(x<=m){
cnt+=shu(x,y,lp);
}
if(y>m){
cnt+=shu(x,y,rp);
}
return cnt;
}
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++){
cin>>s;
if(s==1){
cin>>x>>y>>k;
cheng(x,y,k,1);
}
if(s==2){
cin>>x>>y>>k;
jia(x,y,k,1);
}
if(s==3){
cin>>x>>y;
shu(x,y,1);
cout<<cnt%m;
}
}
return 0;
}