#include<bits/stdc++.h>
#define LL long long
#define ri register long long
#define ls now*2
#define rs now*2+1
using namespace std;
inline LL rd(){
ri res=0,f=1;register char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())res=(res<<1)+(res<<3)+ch-'0';
return res*f;
}
LL a[100005],mu[400005],ad[400005],vl[400005],n,m,p,op,x,y,z;
void bd(LL now,LL l,LL r){
mu[now]=1;
if(l==r)vl[now]=a[l];
else{
ri md=(l+r)>>1;bd(ls,l,md);bd(rs,md+1,r);
vl[now]=vl[ls]+vl[rs];
}
vl[now]%=p;
}
void pd(LL now,LL l,LL r){
ri md=(l+r)>>1;
vl[ls]=(vl[ls]*mu[now]+(md-l+1)*ad[now])%p;
vl[rs]=(vl[rs]*mu[now]+(r-md)*ad[now])%p;
(mu[ls]*=mu[now])%=p;(mu[rs]*=mu[now])%=p;
ad[ls]=(ad[ls]*mu[now]+ad[now])%p;
ad[rs]=(ad[rs]*mu[now]+ad[now])%p;
mu[now]=1;ad[now]=0;
}
void upd(LL now,LL l,LL r){
if(y<l||x>r)return;
if(x<=l&&r<=y){
(vl[now]*=z)%=p;(ad[now]*=z)%=p;
(mu[now]*=z)%=p;return;
}
pd(now,l,r);ri md=(l+r)>>1;
upd(ls,l,md);upd(rs,md+1,r);
vl[now]=(vl[ls]+vl[rs])%p;
}
void up(LL now,LL l,LL r){
if(y<l||x>r)return;
if(x<=l&&r<=y){
(vl[now]+=z*(r-l+1))%=p;
(ad[now]+=z)%=p;return;
}
pd(now,l,r);ri md=(l+r)>>1;
up(ls,l,md);up(rs,md+1,r);
vl[now]=(vl[ls]+vl[rs])%p;
}
LL qr(LL now,LL l,LL r){
if(y<l||x>r)return 0;
if(x<=l&&r<=y)return vl[now];
ri md=(l+r)>>1;
return (qr(ls,l,md)+qr(rs,md+1,r))%p;
}
int main(){
n=rd();m=rd();p=rd();
for(x=1;x<=n;++x)a[x]=rd();
for(bd(1,1,n);m--;){
op=rd();x=rd();y=rd();
if(op==1){z=rd();upd(1,1,n);}
else if(op==2){z=rd();up(1,1,n);}
else printf("%lld\n",qr(1,1,n));
}
return 0;
}