#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e7 + 9;
ll n,m;
ll p;
ll tree[N];
ll a[N];
ll tag[N];
ll gag[N];
inline ll ls(ll p){
return p << 1;
}
inline ll rs(ll p){
return p << 1 | 1;
}
void build(ll wei,ll l,ll r){
tag[wei] = 0;
gag[wei] = 1;
if(l >= r){
tree[wei] = a[l];
return;
}
ll mid = (r + l) >> 1;
build(ls(wei),l,mid);
build(rs(wei),mid + 1,r);
tree[wei] = tree[ls(wei)] + tree[rs(wei)];
}
inline void f(ll wei,ll l,ll r,ll k,ll w){
tree[wei] *= w % p;
tree[wei] %= p;
tree[wei] += (r - l + 1) * k % p;
tag[wei] += k % p;
gag[wei] *= w % p;
}
inline void push_down(ll wei,ll l,ll r){
ll mid = (r + l) >> 1;
f(ls(wei),l,mid,tag[wei],gag[wei]);
f(rs(wei),mid + 1,r,tag[wei],gag[wei]);
tag[wei] = 0;
gag[wei] = 1;
}
void update(ll nl,ll nr,ll l,ll r,ll wei,ll k){
if(nl <= l && r <= nr){
tree[wei] += (r - l + 1) * k % p;
tree[wei] %= p;
tag[wei] += k % p;
return;
}
push_down(wei,l,r);
ll mid = (r + l) >> 1;
if(nl <= mid) update(nl,nr,l,mid,ls(wei),k);
if(nr > mid) update(nl,nr,mid + 1,r,rs(wei),k);
tree[wei] = tree[ls(wei)] % p + tree[rs(wei)] % p;
}
void cheng(ll nl,ll nr,ll l,ll r,ll wei,ll k){
if(nl <= l && r <= nr){
tree[wei] *= k % p;
tag[wei] *= k % p;
gag[wei] *= k % p;
tree[wei] %= p;
tag[wei] %= p;
gag[wei] %= p;
return;
}
push_down(wei,l,r);
ll mid = (r + l) >> 1;
if(nl <= mid) cheng(nl,nr,l,mid,ls(wei),k);
if(nr > mid) cheng(nl,nr,mid + 1,r,rs(wei),k);
tree[wei] = tree[ls(wei)] % p + tree[rs(wei)] % p;
}
ll query(ll nl,ll nr,ll l,ll r,ll wei){
ll res = 0;
if(nl <= l && nr >= r) return tree[wei];
push_down(wei,l,r);
ll mid = (r + l) >> 1;
if(nl <= mid) res += query(nl,nr,l,mid,ls(wei));
if(nr > mid) res += query(nl,nr,mid + 1,r,rs(wei));
return res;
}
int main(){
cin >> n >> m >> p;
for(int i = 1;i <= n;i ++){
cin >> a[i];
}
build(1,1,n);
ll pan;
for(int i = 1;i <= m;i ++){
cin >> pan;
if(pan == 2){
ll x,y,w;
scanf("%lld%lld%lld",&x,&y,&w);
update(x,y,1,n,1,w);
}else if(pan == 1){
ll x,y,w;
scanf("%lld%lld%lld",&x,&y,&w);
cheng(x,y,1,n,1,w);
}else if(pan == 3){
ll x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(x,y,1,n,1) % p);
}
}
}