样例中最后一个输出永远是错的 代码:
#include<bits/stdc++.h>
using namespace std;
const int MOD = (1 << 20);
struct Node {
int l, r;
int val;
int lazy;
};
vector<Node> tree;
void build(int node, int l, int r, const vector<int>& a) {
tree[node].l = l;
tree[node].r = r;
tree[node].lazy = 0;
if (l == r) {
tree[node].val = a[l];
return;
}
int mid = (l + r) / 2;
build(node * 2, l, mid, a);
build(node * 2 + 1, mid + 1, r, a);
tree[node].val = (1LL * tree[node * 2].val * tree[node * 2 + 1].val) % MOD;
}
void pushdown(int node) {
if (tree[node].lazy != 0) {
tree[node * 2].lazy += tree[node].lazy;
tree[node * 2 + 1].lazy += tree[node].lazy;
tree[node * 2].val = (tree[node * 2].val + tree[node].lazy) % MOD;
tree[node * 2 + 1].val = (tree[node * 2 + 1].val + tree[node].lazy) % MOD;
tree[node].lazy = 0;
}
}
void update(int node, int l, int r, int x) {
if (tree[node].l == l && tree[node].r == r) {
tree[node].lazy += x;
tree[node].val = (tree[node].val + x) % MOD;
return;
}
pushdown(node);
int mid = (tree[node].l + tree[node].r) / 2;
if (r <= mid) {
update(node * 2, l, r, x);
} else if (l > mid) {
update(node * 2 + 1, l, r, x);
} else {
update(node * 2, l, mid, x);
update(node * 2 + 1, mid + 1, r, x);
}
tree[node].val = (1LL * tree[node * 2].val * tree[node * 2 + 1].val) % MOD;
}
int query(int node, int l, int r) {
if (tree[node].l == l && tree[node].r == r) {
return tree[node].val;
}
pushdown(node);
int mid = (tree[node].l + tree[node].r) / 2;
if (r <= mid) {
return query(node * 2, l, r);
} else if (l > mid) {
return query(node * 2 + 1, l, r);
} else {
int left = query(node * 2, l, mid);
int right = query(node * 2 + 1, mid + 1, r);
return (1LL * left * right) % MOD;
}
}
int main() {
int n, q;
cin >> n >> q;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
tree.resize(4 * n);
build(1, 0, n - 1, a);
for (int i = 0; i < q; i++) {
int type, l, r, x;
cin >> type >> l >> r;
if (type == 1) {
cin >> x;
update(1, l - 1, r - 1, x);
} else {
int ans = query(1, l - 1, r - 1);
cout << ans << endl;
}
}
return 0;
}