1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112 | #include <bits/stdc++.h>
#define int long long int
using namespace std;
const int M = 571373;
const int MAXn = 1e5 + 9;
int ori[MAXn + 9], t[4 * MAXn + 9], atg[4 * MAXn + 9], mtg[4 * MAXn + 9];
void pushup(int p) {
t[p] = (t[p << 1] + t[p << 1 | 1]) % M;
}
void addtag(int a, int b, int p, int v) {
// p: 子节点
(atg[p] += v) %= M;
(t[p] += v * (b - a + 1) % M) %= M;
}
void multag(int a, int b, int p, int v) {
// p: 子节点
v %= M;
(atg[p] *= v) %= M;
(mtg[p] *= v) %= M;
(t[p] *= v) %= M;
}
void pushdown(int a, int b, int p) {
// p: 当前节点
int m = (a + b) >> 1;
multag(a, m, p << 1, mtg[p]);
multag(m + 1, b, p << 1 | 1, mtg[p]);
addtag(a, m, p << 1, atg[p]);
addtag(m + 1, b, p << 1 | 1, atg[p]);
mtg[p] = 1;
atg[p] = 0;
}
void fini(int a, int b, int p) {
if(a == b) {
t[p] = ori[a] % M;
return;
}
int m = (a + b) >> 1;
fini(a, m, p * 2);
fini(m + 1, b, p * 2 + 1);
pushup(p);
}
void fadd(int x, int y, int a, int b, int p, int v) {
if(x <= a && b <= y) {
addtag(a, b, p, v);
return;
}
int m = (a + b) >> 1;
pushdown(a, b, p);
if(x <= m) fadd(x, y, a, m, p << 1, v);
if(m+1 <= y) fadd(x, y, m + 1, b, p << 1 | 1, v);
pushup(p);
}
void fmul(int x, int y, int a, int b, int p, int v) {
if(x <= a && b <= y) {
multag(a, b, p, v);
return;
}
int m = (a + b) >> 1;
pushdown(a, b, p);
if(x <= m) fmul(x, y, a, m, p << 1, v);
if(m+1 <= y) fmul(x, y, m + 1, b, p << 1 | 1, v);
pushup(p);
}
int fget(int x, int y, int a, int b, int p) {
if(x <= a && b <= y)
return t[p];
pushdown(a, b, p);
int m = (a + b) >> 1;
int sum = 0;
if(x <= m) sum += fget(x, y, a, m, p << 1) % M;
if(m+1 <= y) sum += fget(x, y, m + 1, b, p << 1 | 1) % M;
return sum % M;
}
signed main() {
int n, tms, ia;
scanf("%lld%lld%lld", &n, &tms, &ia);
for(int i = 1; i <= n; i ++)
scanf("%lld", &ori[i]);
for(int i = 1; i <= 4*MAXn; i ++)
mtg[i] = 1;
fini(1, n, 1);
int op;
for(int ims = 1; ims <= tms; ims ++) {
scanf("%lld", &op);
if(op == 1) {
int x, y, v;
scanf("%lld%lld%lld", &x, &y, &v);
fmul(x, y, 1, n, 1, v);
}
else if(op == 2) {
int x, y, v;
scanf("%lld%lld%lld", &x, &y, &v);
fadd(x, y, 1, n, 1, v);
}
else if(op == 3) {
int x, y;
scanf("%lld%lld", &x, &y);
printf("%lld\n", fget(x, y, 1, n, 1));
}
}
return 0;
}
|