#include<bits/stdc++.h>
using namespace std;
const int mn=100000;
long long sum[4*mn+10],a[mn+10],ADD[4*mn+10],TIME[4*mn+10];
int rd()
{
int n=0;
char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')
{
n*=10;
n+=c-'0';
c=getchar();
}
return n;
}
int n,m,q;
void build(int l,int r,int p)
{
if(l==r)
{
sum[p]=a[l];
TIME[p]=1;
return ;
}
else
{
int m=(l+r)>>1;
build(l,m,p*2);
build(m+1,r,p*2+1);
sum[p]=sum[p*2]+sum[p*2+1];
TIME[p]=1;
}
}
void add(int l,int r,int p,int k)
{
ADD[p]+=k;
ADD[p]%=q;
sum[p]+=k*(r-l+1);
sum[p]%=q;
}
void time(int l,int r,int p,int k)
{
ADD[p]*=k;
ADD[p]%=q;
TIME[p]*=k;
TIME[p]%=q;
sum[p]*=k;
sum[p]%=q;
}
void pushdown(int l,int r,int p,int m,bool b)
{
if(!ADD[p]&&!TIME[p])return;
if(b)
{
add(l,m,p*2,ADD[p]);
add(m+1,r,p*2+1,ADD[p]);
ADD[p]=0;
return;
}
else
{
time(l,m,p*2,TIME[p]);
time(m+1,r,p*2+1,TIME[p]);
TIME[p]=1;
return;
}
}
void manyaddchange(int l,int r,int p,int L,int R,int k)
{
if(L<=l&&r<=R)
{
add(l,r,p,k);
return;
}
else
{
int m=(l+r)>>1;
pushdown(l,r,p,m,0);
pushdown(l,r,p,m,1);
if(L<=m)manyaddchange(l,m,p*2,L,R,k);
if(R>m)manyaddchange(m+1,r,p*2+1,L,R,k);
sum[p]=sum[p*2]+sum[p*2+1];
sum[p]%=q;
}
}
void manytimechange(int l,int r,int p,int L,int R,int k)
{
if(L<=l&&r<=R)
{
time(l,r,p,k);
return;
}
else
{
int m=(l+r)>>1;
pushdown(l,r,p,m,0);
pushdown(l,r,p,m,1);
if(L<=m)manytimechange(l,m,p*2,L,R,k);
if(R>m)manytimechange(m+1,r,p*2+1,L,R,k);
sum[p]=sum[p*2]+sum[p*2+1];
sum[p]%=q;
}
}
long long check(int l,int r,int p,int L,int R)
{
if(L<=l&&r<=R)
{
return sum[p];
}
int m=(l+r)>>1;
pushdown(l,r,p,m,0);
pushdown(l,r,p,m,1);
long long ans=0;
if(L<=m)ans+=check(l,m,p*2,L,R);
if(R>m)ans+=check(m+1,r,p*2+1,L,R);
return ans;
}
int main()
{
// freopen("P3373.in","r",stdin);
// freopen("1.out","w",stdout);
n=rd();m=rd();q=rd();
for(int i=1;i<=n;i++)
{
a[i]=rd();
}
build(1,n,1);
int p,x,y,k;
for(int i=1;i<=m;i++)
{
p=rd();x=rd();y=rd();
if(p==1)
{
k=rd();
manytimechange(1,n,1,x,y,k);
}
else if(p==2)
{
k=rd();
manyaddchange(1,n,1,x,y,k);
}
else
{
cout<<check(1,n,1,x,y)%q<<endl;
}
}
return 0;
}