#include <bits/stdc++.h>
#define int long long
using namespace std;
long long a[1000086];
long long b[1000086];
long long bj[1000086];
long long bj2[1000086];
long long numm;
void build(int i, int l, int r) {
if (l == r) {
b[i] = a[l];
return;
}
int mid = (l + r) / 2;
build(i * 2, l, mid);
build(i * 2 + 1, mid + 1, r);
b[i] = b[i * 2] + b[i * 2 + 1];
b[i]%numm;
return;
}
void push_down2(int i,int l,int r,bool flag);
void push_down(int i,int l,int r,bool flag)
{
if(bj[i]==0) return;
int mid=(l+r)/2;
int k=bj[i];
if(flag==0)
{
push_down2(i*2,l,mid,1);
push_down2(i*2+1,mid+1,r,1);
}
b[i*2]+=k*(mid-l+1);
bj[i*2]+=bj[i];
b[i*2+1]+=k*(r-mid);
bj[i*2+1]+=bj[i];
bj[i]=0;
b[i*2]%=numm;
b[i*2+1]%=numm;
return;
}
void push_down2(int i,int l,int r,bool flag)
{
if(bj2[i]==1) return;
int mid=(l+r)/2;
int k=bj2[i];
k%=numm;
if(flag==0)
{
push_down(i*2,l,mid,1);
push_down(i*2+1,mid+1,r,1);
}
b[i*2]*=k;
bj2[i*2]*=bj2[i];
b[i*2]%=numm;
b[i*2+1]*=k;
bj2[i*2+1]*=bj2[i];
b[i*2+1]%=numm;
bj2[i]=1;
return;
}
void add(int i,int l,int r,int nl,int nr,long long k)
{
push_down2(i,l,r,0);
if(l>=nl&&r<=nr)
{
bj[i]+=k;
b[i]+=k*(r-l+1);
b[i]%=numm;
return;
}
else
{
push_down(i,l,r,0);
int mid=(l+r)/2;
if(nl<=mid) add(i*2,l,mid,nl,nr,k);
if(nr>mid) add(i*2+1,mid+1,r,nl,nr,k);
b[i]=b[i*2+1]+b[i*2];
b[i]%=numm;
}
return;
}
void mul(int i,int l,int r,int nl,int nr,long long k)
{
push_down(i,l,r,0);
if(l>=nl&&r<=nr)
{
k%=numm;
bj2[i]*=k;
b[i]*=k;
b[i]%=numm;
return;
}
else
{
push_down2(i,l,r,0);
int mid=(l+r)/2;
if(nl<=mid) mul(i*2,l,mid,nl,nr,k);
if(nr>mid) mul(i*2+1,mid+1,r,nl,nr,k);
b[i]=b[i*2+1]+b[i*2];
b[i]%=numm;
}
return;
}
long long sum(int i,int l,int r,int nl,int nr)
{
long long ssum=0;
if(r<=nr&&l>=nl)
{
return b[i]%numm;
}
push_down2(i,l,r,0);
push_down(i,l,r,0);
int mid=(l+r)/2;
if(nl<=mid) ssum+=sum(i*2,l,mid,nl,nr),ssum%=numm;
if(nr>mid) ssum+=sum(i*2+1,mid+1,r,nl,nr),ssum%=numm;
return ssum;
}
signed main() {
int n,m;
cin>>n>>m>>numm;
for(int i=1;i<=n;i++)
{
cin>>a[i];
bj2[i]=1;
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
int op;
cin>>op;
if(op==1)
{
long long x,y,z;
cin>>x>>y>>z;
mul(1,1,n,x,y,z);
}
if(op==2)
{
long long x,y,z;
cin>>x>>y>>z;
add(1,1,n,x,y,z);
}
if(op==3)
{
int x,y;
cin>>x>>y;
cout<<sum(1,1,n,x,y)%numm<<endl;
}
}
return 0;
}