错误代码:
#include <bits/stdc++.h>
#define C__ const
#define int long long
using namespace std;
C__ int N_ = 1e5 + 10, inf = 0x3f3f3f3f3f3f3f3fLL;
struct Data {
int sum, ma;
Data() { sum = 0, ma = -inf; }
Data(C__ int &a, C__ int &b) { sum = a, ma = b; }
} st[N_ << 2];
#define le (u << 1)
#define ri (u << 1 | 1)
int n, m, a[N_], tn;
void push_up(int u) { st[u].sum = st[le].sum + st[ri].sum, st[u].ma = max(st[le].ma, st[ri].ma); }
void build() {
for (tn = 1; tn <= n + 1; tn <<= 1);
for (int i = 1; i <= n; i++) st[i + tn] = { a[i], a[i] };
for (int u = tn - 1; u; u--) push_up(u);
}
int query(int l, int r) {
int ret = 0;
for (l += tn - 1, r += tn + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
if (~l & 1) ret += st[l ^ 1].sum;
if (r & 1) ret += st[r ^ 1].sum;
}
return ret;
}
void modify(int u, int V) {
u += tn; st[u] = {V, V};
for (u >>= 1; u; u >>= 1)
push_up(u);
}
void dfs(int u, int P) {
if (st[u].ma < P) return;
if (u >= tn) return st[u].sum %= P, st[u].ma %= P, void();
dfs(le, P), dfs(ri, P);
push_up(u);
}
void update(int l, int r, int P) {
int _l = l, _r = r;
for (l += tn - 1, r += tn + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
if (~l & 1) dfs(l ^ 1, P);
if (r & 1) dfs(r ^ 1, P);
}
l = _l + tn - 1, r = _r + tn + 1;
for (l >>= 1, r >>= 1; l ^ r ^ 1; l >>= 1, r >>= 1)
push_up(l), push_up(r);
for (l >>= 1; l; l >>= 1) push_up(l);
}
signed main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
build();
while (m--) {
int c, l, r, k, x;
cin >> c;
if (c == 1) {
cin >> l >> r;
cout << query(l, r) << "\n";
} else if (c == 2) {
cin >> l >> r >> x;
update(l, r, x);
} else {
cin >> k >> x;
modify(k, x);
}
}
return 0;
}
正确代码:
#include <bits/stdc++.h>
#define C__ const
#define int long long
using namespace std;
C__ int N_ = 1e5 + 10, inf = 0x3f3f3f3f3f3f3f3fLL;
struct Data {
int sum, ma;
Data() { sum = 0, ma = -inf; }
Data(C__ int &a, C__ int &b) { sum = a, ma = b; }
} st[N_ << 2];
#define le (u << 1)
#define ri (u << 1 | 1)
int n, m, a[N_], tn;
void push_up(int u) { st[u].sum = st[le].sum + st[ri].sum, st[u].ma = max(st[le].ma, st[ri].ma); }
void build() {
for (tn = 1; tn <= n + 1; tn <<= 1);
for (int i = 1; i <= n; i++) st[i + tn] = { a[i], a[i] };
for (int u = tn - 1; u; u--) push_up(u);
}
int query(int l, int r) {
int ret = 0;
for (l += tn - 1, r += tn + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
if (~l & 1) ret += st[l ^ 1].sum;
if (r & 1) ret += st[r ^ 1].sum;
}
return ret;
}
void modify(int u, int V) {
u += tn; st[u] = {V, V};
for (u >>= 1; u; u >>= 1)
push_up(u);
}
void dfs(int u, int P) {
if (st[u].ma < P) return;
if (u >= tn) return st[u].sum %= P, st[u].ma %= P, void();
dfs(le, P), dfs(ri, P);
push_up(u);
}
void update(int l, int r, int P) {
for (l += tn - 1, r += tn + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
if (~l & 1) dfs(l ^ 1, P);
if (r & 1) dfs(r ^ 1, P);
push_up(l >> 1), push_up(r >> 1);
}
for (l >>= 1; l; l >>= 1) push_up(l);
}
signed main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
build();
while (m--) {
int c, l, r, k, x;
cin >> c;
if (c == 1) {
cin >> l >> r;
cout << query(l, r) << "\n";
} else if (c == 2) {
cin >> l >> r >> x;
update(l, r, x);
} else {
cin >> k >> x;
modify(k, x);
}
}
return 0;
}
Wa on #3,错误代码的push_up有什么问题?