样例输出: 3 17
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, q, m, a[N];
int add[N*4], mul[N*4], s[N*4];
int op, x, y, k;
void build(int u, int l, int r){
if (l == r){
s[u] = a[l] % m;
return ;
}
int mid = (l + r) / 2;
build(u * 2, l, mid);
build(u * 2 + 1, mid + 1, r);
s[u] = s[u*2] + s[u*2+1];
}
void pushdown(int u, int l, int r){
if (mul[u] != 1){
s[u*2] *= mul[u], s[u*2+1] *= mul[u]; s[u*2] %= m, s[u*2+1] %= m;
mul[u*2] *= mul[u], mul[u*2+1] *= mul[u]; mul[u*2] %= m, mul[u*2+1] %= m;
add[u*2] *= mul[u], add[u*2+1] *= mul[u]; add[u*2] %= m, add[u*2+1] %= m;
mul[u] = 1;
}
if (add[u] != 0){
int mid = (l + r) / 2;
s[u*2] += add[u] * (mid-l+1);
s[u*2+1] += add[u] * (r-mid);
s[u*2] %= m, s[u*2+1] %= m;
add[u*2] += add[u], add[u*2+1] += add[u];
add[u*2] %= m, add[u*2+1] %= m;
add[u] = 0;
}
}
void modify(int u, int l, int r, int L, int R, int k, int op) {
if (l > R || r < L) return;
if (L <= l && r <= R) {
if (op == 1){
s[u] = (s[u] * k) % m;
mul[u] = (mul[u] * k) % m;
add[u] = (add[u] * k) % m;
}else{
s[u] += k * (r - l + 1), s[u] %= m;
add[u] += k, add[u] %= m;
}
return;
}
int mid = (l + r) >> 1;
pushdown(u, l, r);
if (L <= mid) modify(u*2, l, mid, L, R, k, op);
if (R > mid) modify(u*2+1, mid + 1, r, L, R, k, op);
s[u] = s[u*2] + s[u*2+1], s[u] %= m;
}
int query(int u, int l, int r, int L, int R){
if (L <= l && r <= R) return s[u];
int mid = (l + r) / 2, res = 0;
pushdown(u, l, r);
if (L <= mid) res += query(u*2, l, mid, L, R);
if (R > mid) res += query(u*2+1, mid+1, r, L, R);
return res % m;
}
int main() {
sizeof(mul, 1, sizeof mul);
scanf("%d %d %d", &n, &q, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
build(1, 1, n);
while (q--){
scanf("%d %d %d", &op, &x, &y);
if (op != 3){
scanf("%d", &k);
modify(1, 1, n, x, y, k, op);
}
if (op == 3) printf("%d\n", query(1, 1, n, x, y));
}
return 0;
}