#include <iostream>
#include <vector>
#define ai_jiang signed main()
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define drep(a,b,c) for(int a=b;a>=c;a--)
#define all(a) a.begin(),a.end()
#define ll long long
#define int long long
using namespace std;
using poly=vector<ll>;
namespace ai {
constexpr int N = 1e5+5;
int n,m,mod,a,b,c,d,e,aa[N];
struct node { int l,r,sum,tag,mu=1; } tr[N<<2];
#define lc(p) (p<<1)
#define rc(p) (p<<1|1)
#define ln(p) (tr[p].r-tr[p].l+1)
void pushup(int x) { return void(tr[x].sum=tr[lc(x)].sum+tr[rc(x)].sum); }
void pushdown(int x) {
if(tr[x].mu!=1) {
tr[lc(x)].sum=tr[lc(x)].sum*tr[x].mu;
tr[rc(x)].sum=tr[rc(x)].sum*tr[x].mu;
tr[lc(x)].tag*=tr[x].mu,tr[rc(x)].tag*=tr[x].mu;
tr[lc(x)].mu*=tr[x].mu,tr[rc(x)].mu*=tr[x].mu;
tr[lc(x)].mu%=mod,tr[rc(x)].mu%=mod,tr[lc(x)].tag%=mod,tr[rc(x)].tag%=mod,tr[lc(x)].sum%=mod,tr[rc(x)].sum%=mod;
tr[x].mu=1;
}
if(tr[x].tag) {
tr[lc(x)].sum+=tr[x].tag*ln(lc(x));
tr[rc(x)].sum+=tr[x].tag*ln(rc(x));
tr[lc(x)].tag+=tr[x].tag,tr[rc(x)].tag+=tr[x].tag;
tr[lc(x)].mu%=mod,tr[rc(x)].mu%=mod,tr[lc(x)].tag%=mod,tr[rc(x)].tag%=mod,tr[lc(x)].sum%=mod,tr[rc(x)].sum%=mod;
tr[x].tag=0;
}
}
void build(int p,int l,int r) {
tr[p]={l,r,aa[l],0,1};
if(l==r) return;
int mid=l+r>>1;
build(lc(p),l,mid); build(rc(p),mid+1,r);
pushup(p);
}
void add(int p,int l,int r,int v) {
if(l<=tr[p].l&&tr[p].r<=r) {
tr[p].sum+=ln(p)*v; tr[p].sum%=mod;
tr[p].tag+=v; tr[p].tag%=mod;
return;
}
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
if(l<=mid) add(lc(p),l,r,v);
if(r>mid) add(rc(p),l,r,v);
pushup(p);
}
void mul(int p,int l,int r,int v) {
if(l<=tr[p].l&&tr[p].r<=r) {
tr[p].sum*=v; tr[p].sum%=mod;
tr[p].mu*=v; tr[p].mu%=mod;
return;
}
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
if(l<=mid) mul(lc(p),l,r,v);
if(r>mid) mul(rc(p),l,r,v);
pushup(p);
}
int qry(int p,int l,int r) {
if(l<=tr[p].l&&tr[p].r<=r) return tr[p].sum%mod;
pushdown(p); int mid=tr[p].l+tr[p].r>>1,ans=0;
if(l<=mid) ans+=qry(lc(p),l,r),ans%=mod;
if(r>mid) ans+=qry(rc(p),l,r),ans%=mod;
return ans%mod;
}
}
using namespace ai;
ai_jiang {
cin.tie(0); cout.tie(0);
cin>>n>>m>>mod;
rep(i,1,n) cin>>aa[i];
build(1,1,n);
rep(i,1,m) {
cin>>a>>b>>c;
if(a==1) {
cin>>d;
mul(1,b,c,d);
} else if(a==2) {
cin>>d;
add(1,b,c,d);
} else if(a==3) {
cout<<(qry(1,b,c)%mod)<<'\n';
}
}
return 0;
}