#include<bits/stdc++.h>
using namespace std;
int m,a[100005],n,q,op,x,y,z;
struct node{
int l,r,num,tag1,tag2;
}tree[400005];
inline int ql(int q){
return q<<1;
}
inline int qr(int q){
return q<<1|1;
}
void MOD(int q){
tree[q].num%=m;
}
void push_up(int q){
tree[q].num=tree[ql(q)].num+tree[qr(q)].num;
MOD(q);
}
void push_down1(int q){
tree[ql(q)].num*=tree[q].tag1;
MOD(ql(q));
tree[ql(q)].tag1*=tree[q].tag1;
tree[qr(q)].num*=tree[q].tag1;
MOD(qr(q));
tree[qr(q)].tag1*=tree[q].tag1;
tree[q].tag1=1;
}
void push_down2(int q){
tree[ql(q)].num+=tree[q].tag2*(tree[ql(q)].r-tree[ql(q)].l+1);
MOD(ql(q));
tree[ql(q)].tag2+=tree[q].tag2;
tree[qr(q)].num+=tree[q].tag2*(tree[qr(q)].r-tree[qr(q)].l+1);
MOD(qr(q));
tree[qr(q)].tag2+=tree[q].tag2;
tree[q].tag2=0;
}
void push_down(int q){push_down2(q);
push_down1(q);
}
void build(int q,int l,int r){
tree[q].l=l;
tree[q].r=r;
tree[q].tag1=1;
if(l==r){
tree[q].num=a[l];
tree[q].num%=m;
return;
}
int mid=l+r>>1;
build(ql(q),l,mid);
build(qr(q),mid+1,r);
push_up(q);
}
void updata1(int q,int l,int r,int k){
if(tree[q].l>=l&&tree[q].r<=r){
tree[q].num*=k;
tree[q].tag1*=k;
return;
}
push_down1(q);
int mid=(tree[q].l+tree[q].r)>>1;
if(mid>=l) updata1(ql(q),l,r,k);
if(r>mid) updata1(qr(q),l,r,k);
push_up(q);
}
void updata2(int q,int l,int r,int k){
if(tree[q].l>=l&&tree[q].r<=r){
tree[q].num+=k*(tree[q].r-tree[q].l+1);
tree[q].tag2+=k;
return;
}
push_down2(q);
int mid=(tree[q].l+tree[q].r)>>1;
if(mid>=l) updata2(ql(q),l,r,k);
if(r>mid) updata2(qr(q),l,r,k);
push_up(q);
}
int query(int l,int r,int q){
if(tree[q].l>=l&&tree[q].r<=r){
return tree[q].num;
}
if(tree[q].r<l||tree[q].l>r){
return 0;
}
push_down(q);
int ans=0;
int mid=(tree[q].l+tree[q].r)>>1;
if(mid>=l){
ans+=query(l,r,ql(q));
ans%=m;
}
if(r>mid){
ans+=query(l,r,qr(q));
ans%=m;
}
return ans;
}
int main(){
cin>>n>>q>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
for(int i=1;i<=q;i++){
cin>>op;
if(op==1){
cin>>x>>y>>z;
updata1(1,x,y,z);
}
if(op==2){
cin>>x>>y>>z;
updata2(1,x,y,z);
}
if(op==3){
cin>>x>>y;
cout<<query(x,y,1)<<endl;
}
}
}