#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1000010;
unsigned ll n,q,m;
unsigned ll a[N],ans[N<<2],t[N<<2],t1[N<<2];
void build(ll p,ll l,ll r);
void f(ll p,ll l,ll r,ll k1,ll k2);
void push_down(ll p,ll l,ll r);
void upd_mul(int p,int l,int r,int x,int y,int k);
void upd_add(int p,int l,int r,int x,int y,int k);
ll get_sum(ll x,ll y,ll l,ll r,ll p);
int main()
{
cin>>n>>q>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(q--)
{
ll f,x,y,k;
cin>>f;
if(f==1)
{
cin>>x>>y>>k;
upd_mul(1,1,n,x,y,k);
}
if(f==2)
{
cin>>x>>y>>k;
upd_add(1,1,n,x,y,k);
}
if(f==3)
{
cin>>x>>y;
cout<<get_sum(x,y,1,n,1);
}
}
return 0;
}
void build(ll p,ll l,ll r)
{
t[p]=0;
if(l==r)
{
ans[p]=a[l];
return ;
}
ll mid=l+r>>1;
build(2*p,l,mid);
build(2*p+1,mid+1,r);
ans[p]=ans[2*p]+ans[2*p+1];
ans[p]%=m;
}
void f(ll p,ll l,ll r,ll k1,ll k2)
{
t[p]+=k1;
t[p]%=m;
t1[p]*=k2%m;
t1[p]%=m;
ans[p]=(ans[p]*k2+k1)+k1*(r-l+1);
return;
}
void push_down(ll p,ll l,ll r)
{
ll mid=(l+r)>>1;
f(2*p,l,mid,t[p],t1[p]);
f(2*p+1,mid+1,r,t[p],t1[p]);
t[p]=0;
t1[p]=1;
}
void upd_mul(ll p,ll l,ll r,ll x,ll y,ll k)
{
if(x<=l && r<=y)
{
t[p]=(t[p]*k)%m;
t1[p]=(t1[p]*k)%m;
ans[p]=(ans[p]*k)%m;
return;
}
push_down(p,l,r);
ll mid=l+r>>1;
if(x<=mid)
upd_mul(2*p,l,mid,x,y,k);
if(y>mid)
upd_mul(2*p+1,mid+1,r,x,y,k);
ans[p]=ans[2*p]+ans[2*p+1]*m;
return;
}
void upd_add(ll p,ll l,ll r,ll x,ll y,ll k)
{
if (x<=l && r<=y)
{
t[p]=(t[p]+k)%m;
ans[p]+=(k*(r-l+1))%m;
ans[p]%=m;
return;
}
push_down(p,l,r);
ll mid=l+r>>1;
if (x<=mid)
upd_add(2*p,l,mid,x,y,k);
if(y>mid)
upd_add(2*p+1,mid+1,r,x,y,k);
ans[p]=ans[2*p]+ans[2*p+1];
ans[p]%=m;
return;
}
ll get_sum(ll x,ll y,ll l,ll r,ll p)
{
ll res=0;
if(x<=l && r<=y)
return ans[p];
ll mid=(l+r)>>1;
push_down(p,l,r);
if(x<=mid)
res+=get_sum(x,y,l,mid,2*p);
if(y>mid)
res+=get_sum(x,y,mid+1,r,2*p+1);
return res;
}