#include<bits/stdc++.h>
using namespace std;
long long n,m,p;
long long c,x,y,k;
long long tag1[100001],tag2[100001];
long long shu[1000001],ru[100001];
void upbuild(int rt) {shu[rt]=shu[rt<<1]+shu[rt<<1|1];tag2[rt]=1;}
void up(int rt) {shu[rt]=shu[rt<<1]+shu[rt<<1|1];}
void build(long long rt,long long l,long long r)
{
if(l==r)
{
shu[rt]=ru[l];
tag2[rt]=1;
return;
}
long long mid=(l+r)/2;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
upbuild(rt);
}
void down(long long rt,long long ln,long long rn)
{
shu[rt<<1]*=tag2[rt];
shu[rt<<1]%=p;
tag2[rt<<1]*=tag2[rt];
tag2[rt<<1]%=p;
shu[rt<<1]+=(tag1[rt]*ln);
shu[rt<<1]%=p;
tag1[rt<<1]=tag1[rt<<1]*tag2[rt]%p+tag1[rt];
tag1[rt<<1]%=p;
if(!tag2[rt]) tag2[rt]=1;
if(!tag2[rt<<1]) tag2[rt<<1]=1;
if(!tag2[rt<<1|1]) tag2[rt<<1|1]=1;
shu[rt<<1|1]*=tag2[rt];
shu[rt<<1|1]%=p;
tag2[rt<<1|1]*=tag2[rt];
tag2[rt<<1|1]%=p;
shu[rt<<1|1]+=(tag1[rt]*rn);
shu[rt<<1|1]%=p;
tag1[rt<<1|1]=tag1[rt<<1|1]*tag2[rt]%p+tag1[rt];
tag1[rt<<1|1]%=p;
if(!tag2[rt]) tag2[rt]=1;
if(!tag2[rt<<1]) tag2[rt<<1]=1;
if(!tag2[rt<<1|1]) tag2[rt<<1|1]=1;
tag1[rt]=0;
tag2[rt]=1;
return;
}
void jia(long long rt,long long l,long long r,long long L,long long R,long long mem)
{
if(l>R||r<L) return;
long long mid=(l+r)/2;
long long ln=mid-l+1,rn=r-mid;
if(L<=l&&r<=R)
{
shu[rt]+=mem*(ln+rn);
shu[rt]%=p;
tag1[rt]+=mem;
return;
}
down(rt,ln,rn);
jia(rt<<1,l,mid,L,R,mem);
jia(rt<<1|1,mid+1,r,L,R,mem);
up(rt);
}
void che(long long rt,long long l,long long r,long long L,long long R,long long mem)
{
if(l>R||r<L) return;
if(L<=l&&r<=R)
{
shu[rt]*=mem;
shu[rt]%=p;
tag1[rt]*=mem;
tag2[rt]*=mem;
return;
}
long long mid=(l+r)/2;
down(rt,mid-l+1,r-mid);
che(rt<<1,l,mid,L,R,mem);
che(rt<<1|1,mid+1,r,L,R,mem);
up(rt);
}
long long cha(long long rt,long long l,long long r,long long L,long long R)
{
if(l>R||r<L) return 0;
if(L<=l&&r<=R)
return shu[rt];
long long mid=(l+r)/2;
down(rt,mid-l+1,r-mid);
long long ans=cha(rt<<1,l,mid,L,R);
ans%=p;
ans+=cha(rt<<1|1,mid+1,r,L,R);
ans%=p;
return ans;
}
int main()
{
// freopen("in.in","r",stdin);
cin>>n>>m>>p;
for(int i=1;i<=n;i++)
cin>>ru[i];
build(1,1,n);
for(int i=1;i<=n;i++)
{
cin>>c;
if(c==1)
{
cin>>x>>y>>k;
che(1,1,n,x,y,k);
}
if(c==2)
{
cin>>x>>y>>k;
jia(1,1,n,x,y,k);
}
if(c==3)
{
cin>>x>>y;
long long ans=cha(1,1,n,x,y);
cout<<ans<<endl;
}
}
return 0;
}
调不出来