#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int n, m, x, y, op, k, cnt = 0, a[N];
ll mod;
struct node {
int ch[2], l, r;
ll al, ml, sum;
} t[2 * N];
#define lson t[i].ch[0]
#define rson t[i].ch[1]
void buildtree(int i, int l, int r) {
t[i].ml = 1, t[i].l = l, t[i].r = r;
if(l == r) {
t[i].sum = a[l] % mod;
return ;
}
lson = ++ cnt; buildtree(lson, l, l + r >> 1);
rson = ++ cnt; buildtree(rson, (r + l >> 1) + 1, r);
t[i].sum = (t[lson].sum + t[rson].sum) % mod;
}
void pdm(int i) {
if(t[i].ml != 1) {
if(lson) {
t[lson].ml *= t[i].ml, t[lson].ml %= mod;
t[lson].al *= t[i].ml, t[lson].al %= mod;
t[lson].sum *= t[i].ml, t[lson].sum %= mod;
}
if(rson) {
t[rson].ml *= t[i].ml, t[rson].ml %= mod;
t[rson].al *= t[i].ml, t[rson].al %= mod;
t[rson].sum *= t[i].ml, t[rson].sum %= mod;
}
t[i].ml = 1;
}
}
void pda(int i) {
if(t[i].al) {
// pdm(i);
if(lson) {
t[lson].sum += (t[lson].r - t[lson].l + 1) * t[i].al, t[lson].sum %= mod;
t[lson].al += t[i].al, t[lson].al %= mod;
}
if(rson) {
t[rson].sum += (t[rson].r - t[rson].l + 1) * t[i].al, t[rson].sum %= mod;
t[rson].al += t[i].al, t[rson].al %= mod;
}
t[i].al = 0;
}
}
void pushdown(int i) {
pdm(i), pda(i);
}
void mul(int i, int l, int r, ll z) {
if(l <= t[i].l && t[i].r <= r) {
t[i].ml *= z, t[i].ml %= mod;
t[i].al *= z, t[i].al %= mod;
t[i].sum *= z, t[i].sum %= mod;
return ;
}
pushdown(i);
if(l <= t[lson].r) mul(lson, l, r, z);
if(r >= t[rson].l) mul(rson, l, r, z);
t[i].sum = (t[lson].sum + t[rson].sum) % mod;
}
void add(int i, int l, int r, ll z) {
if(l <= t[i].l && t[i].r <= r) {
// pdm(i);
t[i].al += z, t[i].al %= mod;
t[i].sum += z * (t[i].r - t[i].l + 1), t[i].sum %= mod;
return ;
}
pushdown(i);
if(l <= t[lson].r) add(lson, l, r, z);
if(r >= t[rson].l) add(rson, l, r, z);
t[i].sum = (t[lson].sum + t[rson].sum) % mod;
}
ll query(int i, int l, int r) {
if(l <= t[i].l && t[i].r <= r) return t[i].sum;
pushdown(i);
ll ans = 0;
if(l <= t[lson].r) ans = (ans + query(lson, l, r)) % mod;
if(r >= t[rson].l) ans = (ans + query(rson, l, r)) % mod;
return ans;
}
int main() {
scanf("%d%d%lld", &n, &m, &mod);
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
buildtree(1, 1, n);
for(int i = 1; i <= m; i ++) {
scanf("%d", &op);
if(op == 1) {
scanf("%d%d%d", &x, &y, &k);
mul(1, x, y, k);
} else if(op == 2) {
scanf("%d%d%d", &x, &y, &k);
add(1, x, y, k);
} else {
scanf("%d%d", &x, &y);
printf("%lld\n", query(1, x, y));
}
}
return 0;
}
不知道为啥样例输出的是13和34