Rt.
#include<bits/stdc++.h>
#define ll long long
#define mul tree[k].mul_lzy
#define pls tree[k].pls_lzy
#define lson (k << 1)
#define rson (k << 1 | 1)
const int MAX = 100000;
int n, q;
ll a[MAX+5], z, mod;
int opt, x, y;
struct Segment_Tree{
struct Tree{
int l, r;
ll sum, pls_lzy, mul_lzy = 1;
}tree[MAX << 2];
inline void push_down(int k) {
tree[lson].sum = (tree[lson].sum * mul % mod + pls * (tree[lson].r - tree[lson].l + 1) % mod) % mod;
tree[rson].sum = (tree[rson].sum * mul % mod + pls * (tree[rson].r - tree[rson].l + 1) % mod) % mod;
tree[lson].mul_lzy = tree[lson].mul_lzy * mul % mod;
tree[rson].mul_lzy = tree[rson].mul_lzy * mul % mod;
tree[lson].pls_lzy = (tree[lson].pls_lzy * mul % mod + pls) % mod;
tree[rson].pls_lzy = (tree[rson].pls_lzy * mul % mod + pls) % mod;
pls = 0, mul = 1;
}
inline void build(int k, int l, int r) {
tree[k].l = l, tree[k].r = r;
if(l == r) {
tree[k].sum = a[l] % mod;
return ;
}
int mid = l + r >> 1;
build(lson, l, mid);
build(rson, mid + 1, r);
tree[k].sum = (tree[lson].sum + tree[rson].sum) % mod;
}
inline void pls_update(int k, int l, int r, ll num) {
if(tree[k].l >= l && tree[k].r <= r) {
tree[k].sum = (tree[k].sum + num * (tree[k].r - tree[k].l + 1) % mod) % mod;
pls = (pls + num) % mod;
return;
}
push_down(k);
if(l <= tree[lson].r) pls_update(lson, l, r, num);
if(r >= tree[rson].l) pls_update(rson, l, r, num);
tree[k].sum = (tree[lson].sum + tree[rson].sum) % mod;
}
inline void mul_update(int k, int l, int r, ll num) {
if(tree[k].l >= l && tree[k].r <= r) {
tree[k].sum = tree[k].sum * num % mod;
mul = mul * num % mod;
return;
}
push_down(k);
if(l <= tree[lson].r) mul_update(lson, l, r, num);
if(r >= tree[rson].l) mul_update(rson, l, r, num);
tree[k].sum = (tree[lson].sum + tree[rson].sum) % mod;
}
inline ll query(int k, int l, int r) {
if(tree[k].l >= l && tree[k].r <= r) return tree[k].sum;
push_down(k);
ll sum = 0;
if(l <= tree[lson].r) sum = (sum + query(lson, l, r)) % mod;
if(r >= tree[rson].l) sum = (sum + query(rson, l, r)) % mod;
return sum;
}
}S_Tree;
int main() {
std::cin >> n >> q >> mod;
for(int i = 1; i <= n; i ++) std::cin >> a[i];
S_Tree.build(1, 1, n);
while(q --> 0) {
std::cin >> opt >> x >> y;
if(opt == 1) {
std::cin >> z;
S_Tree.mul_update(1, x, y, z);
}
else if(opt == 2) {
std::cin >> z;
S_Tree.pls_update(1, x, y, z);
}
else {
std::cout << S_Tree.query(1, x, y) <<'\n';
}
}
return 0;
}
样例过了