#include <bits/stdc++.h>
using namespace std;
const int N=1e6;
#define ll long long
struct node
{
int l,r;
ll data;
ll tag1;
ll tag2;
};
int n,m,mod;
ll a[N];
node t[N];
void build(int p,int l,int r)
{
t[p].l=l;
t[p].r=r;
t[p].tag1=0;
t[p].tag2=1;
if (l==r)
{
t[p].data=a[l];
return ;
}
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
t[p].data=(t[p*2].data+t[p*2+1].data)%mod;
}
void pushdown(int u)
{
t[u*2].data*=t[u].tag2;
t[u*2].data%=mod;
t[u*2+1].data*=t[u].tag2;
t[u*2+1].data%=mod;
t[u*2].tag2*=t[u].tag2;
t[u*2+1].tag2*=t[u].tag2;
t[u*2].tag2%=mod;
t[u*2+1].tag2%=mod;
t[u*2].data+=(t[u*2].r-t[u*2].l+1)*t[u].tag1;
t[u*2].data%=mod;
t[u*2+1].data+=(t[u*2+1].r-t[u*2+1].l+1)*t[u].tag1;
t[u*2+1].data%=mod;
t[u*2].tag1+=t[u].tag1;
t[u*2+1].tag1+=t[u].tag1;
t[u*2].tag1%=mod;
t[u*2+1].tag1%=mod;
t[u].tag1=0;
t[u].tag2=1;
return ;
}
void add1(int p,int l,int r,int k)
{
if (l<=t[p].l && t[p].r<=r)
{
t[p].data+=(t[p].r-t[p].l+1)*k;
t[p].data%=mod;
t[p].tag1+=k;
t[p].tag1%=mod;
return ;
}
int mid=(t[p].l+t[p].r)/2;
pushdown(p);
if (l<=mid)
{
add1(p*2,l,r,k);
}
if (r>mid)
{
add1(p*2+1,l,r,k);
}
t[p].data=(t[p*2].data+t[p*2+1].data)%mod;
}
void add2(int p,int l,int r,int k)
{
if (l<=t[p].l && t[p].r<=r)
{
t[p].data*=k;
t[p].data%=mod;
t[p].tag1*=k;
t[p].tag2*=k;
t[p].tag1%=mod;
t[p].tag2%=mod;
return ;
}
int mid=(t[p].l+t[p].r)/2;
pushdown(p);
if (l<=mid)
{
add2(p*2,l,r,k);
}
if (r>mid)
{
add2(p*2+1,l,r,k);
}
t[p].data=(t[p*2].data+t[p*2+1].data)%mod;
}
int ask(int p,int l,int r)
{
ll ans=0;
if (l<=t[p].l && t[p].r<=r)
{
return t[p].data;
}
pushdown(p);
int mid=(t[p].l+t[p].r)/2;
if (l<=mid)
{
ans+=ask(p*2,l,r);
}
if (r>mid)
{
ans+=ask(p*2+1,l,r);
}
return ans%mod;
}
int main()
{
scanf("%d%d%d",&n,&m,&mod);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(1,1,n);
for (int i=1;i<=m;i++)
{
int op;
scanf("%d",&op);
if (op==1)
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
add2(1,x,y,k);
}
else if (op==2)
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
add1(1,x,y,k);
}
else
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",ask(1,x,y));
}
}
system("pause");
return 0;
}