#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXX = 8e5 + 5;
int n, q, x, y, k, t[MAXX], a[MAXX], op, lazy[MAXX], sum[MAXX], c[MAXX], M;
void update(int st){
t[st] = t[st * 2] + t[st * 2 + 1];
}
void pushdown(int st){
// cout << c[st] << " " << c[st * 2] << " " << c[st * 2 + 1] << '\n';
t[st * 2] = (t[st * 2] * c[st] + sum[st * 2] * lazy[st]) % M;
t[st * 2 + 1] = (t[st * 2 + 1] * c[st] + sum[st * 2 + 1] * lazy[st]) % M;
c[st * 2] = c[st * 2] * c[st];
c[st * 2 + 1] = c[st * 2 + 1] * c[st];
lazy[st * 2] = (lazy[st * 2] * c[st] % M + lazy[st]) % M;
lazy[st * 2 + 1] = (lazy[st * 2 + 1] * c[st] % M + lazy[st]) % M;
lazy[st] = 0;
c[st] = 1;
}
void build(int l, int r, int st){
sum[st] = r - l + 1;
if(l == r){
t[st] = a[l];
return;
}
int mid = (l + r) / 2;
build(l, mid, st * 2);
build(mid + 1, r, st * 2 + 1);
update(st);
}
void add(int L, int R, int l, int r, int s, int st){
if(l >= L && r <= R){
t[st] = (t[st] + sum[st] * s) % M;
lazy[st] = (lazy[st] + s) % M;
return;
}
pushdown(st);
int mid = (l + r) / 2;
if(L <= mid){
add(L, R, l, mid, s, st * 2);
}
if(R > mid){
add(L, R, mid + 1, r, s, st * 2 + 1);
}
update(st);
}
void cheng(int L, int R, int l, int r, int s, int st){
if(l >= L && r <= R){
t[st] = t[st] * s % M;
c[st] = c[st] * s % M;
lazy[st] = lazy[st] * s % M;
return;
}
pushdown(st);
int mid = (l + r) / 2;
if(L <= mid){
add(L, R, l, mid, s, st * 2);
}
if(R > mid){
add(L, R, mid + 1, r, s, st * 2 + 1);
}
update(st);
}
int answer(int L, int R, int l, int r, int st){
if(l >= L && r <= R){
return t[st] % M;
}
pushdown(st);
int mid = (l + r) / 2, sum = 0;
if(L <= mid){
sum += answer(L, R, l, mid, st * 2);
}
if(R > mid){
sum += answer(L, R, mid + 1, r, st * 2 + 1);
}
return sum % M;
}
signed main(){
cin >> n >> q >> M;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
for(int i = 1; i <= n * 4; i++){
c[i] = 1;
}
build(1, n, 1);
// for(int i = 1; i <= 4 * n; i++){
// cout << t[i] << " ";
// }
// cout << '\n';
while(q--){
cin >> op;
if(op == 1){
cin >> x >> y >> k;
cheng(x, y, 1, n, k, 1);
}else if(op == 2){
cin >> x >> y >> k;
add(x, y, 1, n, k, 1);
}else{
cin >> x >> y;
cout << answer(x, y, 1, n, 1) << '\n';
}
// for(int i = 1; i <= 4 * n; i++){
// cout << t[i] << " " << c[i] << " " << lazy[i] << '\n';
// }
// cout << '\n';
}
return 0;
}