#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lc x<<1
#define rc x<<1|1
int a[550000];
struct fu {
int sum,add,mdd,r,l;
} t[550000];
int n,m;
int mm;
void bt(int x,int l,int r) {
t[x].mdd=1;
t[x].add=0;
t[x].l=l;
t[x].r=r;
if(l==r) {
t[x].sum=a[l];
return ;
}
int mid=(l+r)/2;
bt(lc,l,mid);
bt(rc,mid+1,r);
t[x].sum=(t[lc].sum+t[rc].sum)%mm;
}
void sd(int x,int l,int r) {
int mid=(l+r)/2;
t[lc].sum=(t[lc].sum*t[x].mdd+t[lc].add*(mid-l+1))%mm;
t[rc].sum=(t[rc].sum*t[x].mdd+t[rc].add*(r-mid))%mm;
t[lc].mdd=(t[lc].mdd*t[x].mdd)%mm;
t[rc].mdd=(t[rc].mdd*t[x].mdd)%mm;
t[lc].add=(t[lc].add*t[x].mdd+t[x].add)%mm;
t[rc].add=(t[rc].add*t[x].mdd+t[x].add)%mm;
t[x].mdd=1;
t[x].add=0;
return ;
}
void ad(int l,int r,int num,int mum,int x) {
if(r<t[x].l||t[x].r<l)return;
if(t[x].l>=l&&t[x].r<=r) {
t[x].add=(t[x].add+num)%mm;
t[x].sum=(t[x].sum+(t[x].r-t[x].l+1)*num)%mm;
t[x].sum=(t[x].sum*mum)%mm;
t[x].mdd=(t[x].mdd*mum)%mm;
t[x].add=(t[x].add*mum)%mm;
return ;
}
sd(x,t[x].l,t[x].r);
int mid=(t[x].l+t[x].r)>>1;
ad(l,r,num,mum,lc);
ad(l,r,num,mum,rc);
t[x].sum=(t[lc].sum+t[rc].sum)%mm;
}
int fd(int l,int r,int x) {
if(r<t[x].l||t[x].r<l)return 0;
if(t[x].l>=l&&t[x].r<=r) {
return t[x].sum%mm;
}
int mid=(t[x].l+t[x].r)>>1;
sd(x,t[x].l,t[x].r);
return (fd(l,r,lc)%mm+fd(l,r,rc)%mm)%mm;
}
signed main() {
cin>>n>>m>>mm;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
bt(1,1,n);
for(int i=1; i<=m; i++) {
int q=0;
cin>>q;
int st=0,w=0,e=0;
if(q==1) {
cin>>st>>w>>e;
ad(st,w,0,e,1);
} else if(q==2) {
cin>>st>>w>>e;
ad(st,w,e,1,1);
} else if(q==3) {
cin>>st>>w;
cout<<fd(st,w,1)<<endl;
}
}
return 0;
}