#include <bits/stdc++.h>
#include <cstdio>
#define ll long long
using namespace std;
const int N = 1e5 + 10;
ll d[4 * N], bc[4 * N], bj[4 * N];
int n, q, mod;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9') {
if(ch == '-')f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
inline void pd(ll p, ll s, ll t) {
ll l = p * 2;
ll r = p * 2 + 1;
ll m = (l + r) >> 1;
if(bc[p] != 1) {
bc[l] *= bc[p];
bc[l] %= mod;
bc[r] *= bc[p];
bc[r] %= mod;
d[l] *= bc[p];
d[l] %= mod;
d[r] *= bc[p];
d[r] %= mod;
bj[l] *= bc[p];
bj[l] %= mod;
bj[r] *= bc[p];
bj[r] %= mod;
bc[p] = 1;
}
if(bj[p]) {
d[l] += bj[p] * (m - s + 1);
d[l] %= mod;
d[r] += bj[p] * (t - m);
d[r] %= mod;
bj[l] += bj[p];
bj[l] %= mod;
bj[r] += bj[p];
bj[r] %= mod;
bj[p] = 0;
}
return ;
}
inline void build(ll l, ll r, ll p) {
bc[p] = 1;
if(l == r) {
d[p] = read();
return ;
}
int m = (l + r) >> 1;
build(l , m, p * 2);
build(m + 1, r, p * 2 + 1);
d[p] = (d[p * 2] + d[p * 2 + 1]) % mod;
}
inline void cheng(ll l, ll r, ll cs, ll s, ll t, ll p) {
if(l <= s && t <= r) {
bc[p] *= cs;
bc[p] %= mod;
d[p] *= cs;
d[p] %= mod;
return ;
}
ll m = (s + t) >> 1;
pd(p, s, t);
if(l <= m)cheng(l, r, cs, s, m, p * 2);
if(r > m)cheng(l, r, cs, m + 1, t, p * 2 * 1);
d[p] = (d[p * 2] + d[p * 2 + 1]) % mod;
}
inline void jia(ll l, ll r, ll cs, ll s, ll t, ll p) {
if(l <= s && t <= r) {
d[p] += cs * (t - s + 1);
d[p] %= mod;
bj[p] += cs;
bj[p] %= mod;
return ;
}
ll m = (s + t) >> 1;
pd(p, s, t);
if (l <= m) jia(l, r, cs, s, m, p * 2);
if (r > m) jia(l, r, cs, m + 1, t, p * 2 + 1);
}
inline ll getsum(ll l, ll r, ll s, ll t, ll p) {
if(l <= s && t <= r) {
return d[p];
}
ll m = s + (t - s) / 2;
pd(p, s, t);
ll sum = 0;
if(l <= m) sum += getsum(l, r, s, m, p * 2);
if(r > m) sum += getsum(l , r, m + 1, t, p * 2 + 1);
return sum % mod;
}
int main() {
int x1, x2, x3, x4;
n = read();
q = read();
mod = read();
build(1, n, 1);
for(int i = 1; i <= q; i ++ ) {
x1 = read(), x2 = read(), x3 = read();
if(x1 == 1) {
x4 = read();
cheng(x2, x3, x4, 1, n, 1);
} else if(x1 == 2) {
x4 = read();
jia(x2, x3, x4, 1, n, 1);
} else if(x1 == 3) {
printf("%lld\n", getsum(x2, x3, 1, n, 1));
}
}
return 0;
}