#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Tree{
const int maxn=100005;
int val[maxn];
int n,m;
int p;
struct tree{
int l,r;
int lson,rson;
int sum;
int tag;
int mul;
}a[maxn*2];
void pushup(int x){
a[x].sum=(a[a[x].lson].sum+a[a[x].rson].sum)%p;
}
int cnt=0;
int Root;
void Build(int &x,int l,int r){
if(x==0){
x=++cnt;
a[x].l=l;
a[x].r=r;
a[x].tag=0;
a[x].mul=1;
}
if(l==r){
a[x].sum=val[l];
return ;
}
int mid=(l+r)/2;
Build(a[x].lson,l,mid);
Build(a[x].rson,mid+1,r);
pushup(x);
}
void pushdown(int x){
if(a[x].mul!=1){
a[a[x].lson].sum=(a[a[x].lson].sum*a[x].mul)%p;
a[a[x].rson].sum=(a[a[x].rson].sum*a[x].mul)%p;
a[a[x].lson].mul=(a[a[x].lson].mul*a[x].mul)%p;
a[a[x].rson].mul=(a[a[x].rson].mul*a[x].mul)%p;
a[a[x].lson].tag=(a[a[x].lson].tag*a[x].mul)%p;
a[a[x].rson].tag=(a[a[x].rson].tag*a[x].mul)%p;
}
if(a[x].tag!=0){
a[a[x].lson].sum=(a[a[x].lson].sum+a[x].tag)%p;
a[a[x].rson].sum=(a[a[x].rson].sum+a[x].tag)%p;
a[a[x].lson].tag=(a[a[x].lson].tag+a[x].tag)%p;
a[a[x].rson].tag=(a[a[x].rson].tag+a[x].tag)%p;
}
a[x].tag=0;
a[x].mul=1;
}
void change(int x,int l,int r,int y){
if(l>a[x].r||r<a[x].l)
return ;
if(l<=a[x].l&&a[x].r<=r){
a[x].sum=(a[x].sum+y*(a[x].r-a[x].l+1))%p;
a[x].tag=(a[x].tag+y)%p;
return ;
}
pushdown(x);
change(a[x].lson,l,r,y);
change(a[x].rson,l,r,y);
pushup(x);
}
void mul(int x,int l,int r,int y){
if(l>a[x].r||r<a[x].l)
return ;
if(l<=a[x].l&&a[x].r<=r){
a[x].sum=(a[x].sum*y)%p;
a[x].mul=(a[x].mul*y)%p;
a[x].tag=(a[x].tag*y)%p;
return ;
}
pushdown(x);
change(a[x].lson,l,r,y);
change(a[x].rson,l,r,y);
pushup(x);
}
long long ask(int x,int l,int r){
if(a[x].l>r||a[x].r<l)
return 0;
if(l<=a[x].l&&a[x].r<=r)
return a[x].sum;
pushdown(x);
return (ask(a[x].lson,l,r)+ask(a[x].rson,l,r))%p;
pushup(x);
}
int main(){
cin>>n>>m>>p;
for(int i=1;i<=n;i++)
cin>>val[i];
Build(Root,1,n);
for(int i=1;i<=m;i++){
int op;
int x,y;
cin>>op>>x>>y;
if(op==1){
int k;
cin>>k;
change(Root,x,y,k);
}
else if(op==2){
int k;
cin>>k;
mul(Root,x,y,k);
}
else
printf("%lld\n",ask(Root,x,y)%p);
}
return 0;
}
}
signed main(){return (int)Tree::main();}