#include<bits/stdc++.h>
#define N 100001
using namespace std;
struct node
{
long long sum,l,r,f1,f2;
}t[4*N];
long long n,a[N],q,x,y,k,m;
int flag;
void push_down(long long p)
{
t[p*2].sum=(t[p*2].sum*t[p].f2+t[p].f1*(t[p*2].r-t[p*2].l+1))%m;
t[p*2+1].sum=(t[p*2+1].sum*t[p].f2+t[p].f1*(t[p*2+1].r-t[p*2+1].l+1))%m;
t[p*2].f2=(t[p*2].f2*t[p].f2)%m;
t[p*2+1].f2=(t[p*2+1].f2*t[p].f2)%m;
t[p*2].f1=(t[p*2].f1*t[p].f2+t[p].f1)%m;
t[p*2+1].f1=(t[p*2+1].f1*t[p].f2+t[p].f1)%m;
t[p].f2=1;
t[p].f1=0;
}
void push_up(long long p)
{
t[p].sum=(t[p*2].sum+t[p*2+1].sum)%m;
}
void build(long long p,long long l,long long r)
{
t[p].f1=0;
t[p].f2=1;
t[p].l=l,t[p].r=r;
if(l==r)
{
t[p].sum=a[l];
t[p].sum%=m;
return ;
}
long long mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
t[p].sum=t[p*2].sum+t[p*2+1].sum;
t[p].sum%=m;
}
long long query(long long p,long long l,long long r)
{
if(t[p].r<l||t[p].l>r) return 0;
if(t[p].l>=l&&t[p].r<=r)
{
return t[p].sum;
}
push_down(p);
return (query(p*2,l,r)+query(p*2+1,l,r))%m;
}
void updata(long long p,long long l,long long r,long long v)
{
if(t[p].r<l||t[p].l>r) return ;
if(t[p].l>=l&&t[p].r<=r)
{
t[p].f1=(t[p].f1+v)%m;
t[p].sum=(t[p].sum+(t[p].r-t[p].l+1)*v)%m;
return ;
}
push_down(p);
updata(p*2,l,r,v);
updata(p*2+1,l,r,v);
push_up(p);
}
void upupdata(long long p,long long l,long long r,long long v)
{
if(t[p].r<l||t[p].l>r) return ;
if(t[p].l>=l&&t[p].r<=r)
{
t[p].sum=(t[p].sum*v)%m;
t[p].f2=(t[p].f2*v)%m;
t[p].f1=(t[p].f1*v)%m;
return ;
}
push_down(p);
updata(p*2,l,r,v);
updata(p*2+1,l,r,v);
push_up(p);
}
int main()
{
ios::sync_with_stdio(0);
cout.tie(0);
cin.tie(0);
cin >> n >> q >> m;
for(long long i=1;i <=n;i++)
cin >> a[i];
build(1,1,n);
for(long long i=1;i <=q;i++)
{
cin >> flag >> x >> y;
if(flag==1)
{
cin >> k;
upupdata(1,x,y,k);
}
else if(flag==2)
{
cin >> k;
updata(1,x,y,k);
}
}
return 0;
}