#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN =1e5+5;
ll n,m,p;
ll a[MAXN];
struct T{
ll sum,l,r,s1,s2;
}tree[MAXN*4];
void build(ll id,ll l,ll r){
tree[id].l=l,tree[id].r=r;
tree[id].s1=1,tree[id].s2=0;
if(l==r){
tree[id].sum=a[l];
}
else{
ll mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
return ;
}
void pushdown(ll id){
tree[id*2].sum=(tree[id*2].sum*tree[id].s1+tree[id].s2*(tree[id*2].r-tree[id*2].l+1))%p;
tree[id*2].s1=(tree[id].s1*tree[id*2].s1)%p;
tree[id*2].s2=(tree[id*2].s2+tree[id].s2)%p;
tree[id*2+1].sum=(tree[id*2+1].sum*tree[id].s1+tree[id].s2*(tree[id*2+1].r-tree[id*2+1].l+1))%p;
tree[id*2+1].s1=(tree[id*2+1].s1*tree[id].s1)%p;
tree[id*2+1].s2=(tree[id*2+1].s2+tree[id].s2)%p;
tree[id].s1=1;
tree[id].s2=0;
}
void muti(ll id,ll l,ll r,ll val){
if(l<=tree[id].l&&tree[id].r<=r){
tree[id].s2=(tree[id].s2*val)%p;
tree[id].sum=(tree[id].sum*val)%p;
tree[id].s1=(tree[id].s1*val)%p;
}
else{
pushdown(id);
ll mid=(tree[id].l+tree[id].r)/2;
if(l<=mid) muti(id*2,l,r,val);
if(mid<r) muti(id*2+1,l,r,val);
tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
tree[id].sum%=p;
}
return ;
}
void add(ll id,ll l,ll r,ll val){
if(l<=tree[id].l&&tree[id].r<=r){
tree[id].sum=(tree[id].sum+(tree[id].r-tree[id].l+1)*val)%p;
tree[id].s2=(tree[id].s2+val)%p;
}
else{
pushdown(id);
ll mid=(tree[id].l+tree[id].r)/2;
if(l<=mid) muti(id*2,l,r,val);
if(mid<r) muti(id*2+1,l,r,val);
tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
tree[id].sum%=p;
}
return ;
}
ll s(ll id,ll l,ll r){
if(l<=tree[id].l&&tree[id].r<=r){
return tree[id].sum;
}
pushdown(id);
ll ans=0,mid=(tree[id].l+tree[id].r)/2;
if(l<=mid) ans+=s(id*2,l,r);
if(mid<r) ans+=s(id*2+1,l,r);
return ans;
}
int main(){
scanf("%lld%lld%lld",&n,&m,&p);
for(int i=1;i<=n;i++){
scanf("%lld",a+i);
}
build(1,1,n);
while(m--){
int opt;
scanf("%d",&opt);
if(opt==1){
ll x,y,k;
scanf("%lld%lld%lld",&x,&y,&k);
muti(1,x,y,k);
}
if(opt==2){
ll x,y,k;
scanf("%lld%lld%lld",&x,&y,&k);
add(1,x,y,k);
}
if(opt==3){
ll x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",s(1,x,y)%p);
}
}
return 0;
}