没过样例。。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5;
int mod, sum[N << 2], a[N], add[N << 2], mul[N << 2];
inline void PushUp(int x) {
sum[x] = (sum[x << 1] + sum[x << 1 | 1]) % mod;
}
inline void Build(int l, int r, int x) {
if(l == r) {
sum[x] = a[l];
return ;
}
int mid = l + r >> 1;
Build(l, mid, x << 1);
Build(mid + 1, r, x << 1 | 1);
PushUp(x);
}
inline void PushDown(int x, int ln, int rn) {
mul[x << 1] *= mul[x];
mul[x << 1 | 1] *= mul[x];
add[x << 1] = add[x << 1] * mul[x] + add[x];
add[x << 1 | 1] = add[x << 1 | 1] * mul[x] + add[x];
sum[x << 1] = sum[x << 1] * mul[x] + ln * add[x];
sum[x << 1 | 1] = sum[x << 1 | 1] * mul[x] + rn * add[x];
mul[x << 1] %= mod;
mul[x << 1 | 1] %= mod;
add[x << 1] %= mod;
add[x << 1 | 1] %= mod;
sum[x << 1] %= mod;
sum[x << 1 | 1] %= mod;
add[x] = 0; mul[x] = 1;
}
inline void Update_add(int L, int R, int C, int l, int r, int x) {
if(L <= l && R >= r) {
sum[x] += (r - l + 1) * C;
add[x] += C;
sum[x] %= mod;
add[x] %= mod;
return ;
}
int mid = l + r >> 1;
PushDown(x, mid - l + 1, r - mid);
if(L <= mid) Update_add(L, R, C, l, mid, x << 1);
if(R > mid) Update_add(L, R, C, mid + 1, r, x << 1 | 1);
PushUp(x);
}
inline void Update_mul(int L, int R, int C, int l, int r, int x) {
if(L <= l && R >= r) {
sum[x] *= C;
add[x] *= C;
mul[x] *= C;
sum[x] %= mod;
add[x] %= mod;
mul[x] %= mod;
return ;
}
int mid = l + r >> 1;
PushDown(x, mid - l + 1, r - mid);
if(L <= mid) Update_mul(L, R, C, l, mid, x << 1);
if(R > mid) Update_mul(L, R, C, mid + 1, r, x << 1 | 1);
PushUp(x);
}
inline int Query(int L, int R, int l, int r, int x) {
if(L <= l && r <= R) {
return sum[x];
}
int mid = l + r >> 1;
PushDown(x, mid - l + 1, r - mid);
int ans = 0;
if(L <= mid) ans += Query(L, R, l, mid, x << 1);
if(R > mid) ans += Query(L, R, mid + 1, r, x << 1 | 1);
ans %= mod;
return ans;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int m, n;
cin >> n >> m >> mod;
for(int i = 1; i < N << 2; i ++) mul[i] = 1;
for(int i = 1; i <= n; i ++)cin >> a[i];
Build(1, n, 1);
while(m --) {
int op, l, r, C;
cin >> op;
if(op == 1) {
cin >> l >> r >> C;
Update_add(l, r, C, 1, n, 1);
}
else if(op == 2){
cin >> l >> r >> C;
Update_mul(l, r, C, 1, n, 1);
}
else {
cin >> l >> r;
cout << Query(l, r, 1, n, 1) % mod<< '\n';
}
}
return 0;
}