#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
void solve()
{
int n,q,m;
cin>>n>>q>>m;
int len=sqrt(n);
vector<int>a(n+1),b1(n+1,0),b2(n+1,1),s(n+1,0),id(n+1);
for(int i=1;i<=n;i++) {
cin>>a[i];
id[i]=(i-1)/len+1;
s[id[i]]+=a[i];
}a
auto modify=[&](int l,int r,int x,int y) {
int sid=id[l],eid=id[r];
if(sid==eid) {
for(int i=l;i<=r;i++) s[id[i]]=s[id[i]]-(a[i]*b2[id[i]]+b1[id[i]]),a[i]=(a[i]+x)*y+(y-1)*b1[id[i]],s[id[i]]+=(a[i]*b2[id[i]]+b1[id[i]]),s[id[i]]%=m,a[i]%=m;
} else {
for(int i=l;id[i]==sid;i++) s[id[i]]-=(a[i]*b2[id[i]]+b1[id[i]]),a[i]=(a[i]+x)*y+(y-1)*b1[id[i]],s[id[i]]+=(a[i]*b2[id[i]]+b1[id[i]]),s[id[i]]%=m,a[i]%=m;
for(int i=sid+1;i<eid;i++) b1[i]+=x,b1[i]*=y,b2[i]*=y,s[i]+=len*x,s[i]*=y,b1[i]%m,b2[i]%=m,s[i]%=m;
for(int i=r;id[i]==eid;i--) s[id[i]]-=(a[i]*b2[id[i]]+b1[id[i]]),a[i]=(a[i]+x)*y+(y-1)*b1[id[i]],s[id[i]]+=(a[i]*b2[id[i]]+b1[id[i]]),s[id[i]]%=m,a[i]%=m;
}
};
auto query=[&](int l,int r) {
int sid=id[l],eid=id[r],ans=0;
if(sid==eid) {
for(int i=l;i<=r;i++) ans+=(a[i]*b2[id[i]]+b1[id[i]]),ans%=m;
} else {
for(int i=l;id[i]==sid;i++) ans+=(a[i]*b2[id[i]]+b1[id[i]]),ans%=m;
for(int i=sid+1;i<eid;i++) ans+=s[i],ans%=m;
for(int i=r;id[i]==eid;i--) ans+=(a[i]*b2[id[i]]+b1[id[i]]),ans%=m;
}
cout<<ans%m<<endl;
};
for(int i=1;i<=q;i++) {
int op;cin>>op;
if(op==1) {
int x,y,k;
cin>>x>>y>>k;
modify(x,y,0,k);
} else if(op==2) {
int x,y,k;
cin>>x>>y>>k;
modify(x,y,k,1);
} else {
int x,y;
cin>>x>>y;
query(x,y);
}
}
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1;
while(T--) {
solve();
}
return 0;
}