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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
| #include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100005;
const int INF = 2147483647;
int qans, a[maxn], n;
struct Node {
int mx, set, add, hmx, hset, hadd;
bool is_set;
Node *lc, *rc;
inline void pushup() {
mx = max(lc->mx, rc->mx);
hmx = max(lc->hmx, rc->hmx);
}
inline void ADD(int val, int fval) {
if (is_set) {
hset = max(hset, set + fval);
set += val;
}
else {
hadd = max(hadd, add + fval);
add += val;
}
hmx = max(hmx, mx + fval);
mx += val;
}
inline void SET(int val, int fval) {
if (is_set) {
hset = max(hset, fval);
set = val;
}
else {
add = 0;
is_set = true;
hset = fval;
set = val;
}
hmx = max(hmx, fval);
mx = val;
}
inline void pushdown() {
lc->ADD(add, hadd);
rc->ADD(add, hadd);
if (is_set) {
lc->SET(set, hset);
rc->SET(set, hset);
}
is_set = false;
add = hadd = 0;
}
} *rt, node[maxn*2];
int tot;
Node *build(int l, int r) {
Node *ret = node + (tot++);
ret->is_set = false;
ret->add = ret->hadd = 0;
if (l == r) ret->mx = ret->hmx = a[l];
else {
int mid = (l + r) >> 1;
ret->lc = build(l, mid);
ret->rc = build(mid + 1, r);
ret->pushup();
}
return ret;
}
void add(Node *x, int l, int r, int ll, int rr, int v) {
if (ll <= l && r <= rr) x->ADD(v, v);
else {
x->pushdown();
int mid = (l + r) >> 1;
if (ll <= mid) add(x->lc, l, mid, ll, rr, v);
if (rr > mid) add(x->rc, mid+1, r, ll, rr, v);
x->pushup();
}
}
void set(Node *x, int l, int r, int ll, int rr, int v) {
if (ll <= l && r <= rr) x->SET(v, v);
else {
x->pushdown();
int mid = (l + r) >> 1;
if (ll <= mid) set(x->lc, l, mid, ll, rr, v);
if (rr > mid) set(x->rc, mid+1, r, ll, rr, v);
x->pushup();
}
}
void ask_max(Node *x, int l, int r, int ll, int rr) {
if (qans >= x->mx) return;
if (ll <= l && r <= rr) qans = x->mx;
else {
x->pushdown();
int mid = (l + r) >> 1;
if (ll <= mid) ask_max(x->lc, l, mid, ll, rr);
if (rr > mid) ask_max(x->rc, mid+1, r, ll, rr);
}
}
void ask_hmax(Node *x, int l, int r, int ll, int rr) {
if (qans >= x->hmx) return;
if (ll <= l && r <= rr) qans = x->hmx;
else {
x->pushdown();
int mid = (l + r) >> 1;
if (ll <= mid) ask_hmax(x->lc, l, mid, ll, rr);
if (rr > mid) ask_hmax(x->rc, mid+1, r, ll, rr);
}
}
inline int getint() {
int r = 0; bool b = true; char c = getchar();
while ('0' > c || c > '9') { if (c == '-') b = false; c = getchar(); }
while ('0' <= c && c <= '9') { r = r * 10 + (c - '0'); c = getchar(); }
if (b) return r;
return -r;
}
char str[3];
int m, x, y, z;
int main() {
n = getint();
for (int i = 1, *aa = a + 1; i <= n; ++i, ++aa) (*aa) = getint();
rt = build(1, n);
m = getint();
while (m--) {
scanf("%s", str);
x = getint(); y = getint();
if (str[0] == 'Q') {
qans = -INF;
ask_max(rt, 1, n, x, y);
printf("%d\n", qans);
}
else if (str[0] == 'A') {
qans = -INF;
ask_hmax(rt, 1, n, x, y);
printf("%d\n", qans);
}
else {
z = getint();
if (str[0] == 'P') add(rt, 1, n, x, y, z);
else set(rt, 1, n, x, y, z);
}
}
}
|