```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; struct Node { int val; int cnt; Node(int v = 0, int c = 0) : val(v), cnt(c) {} }; class SegTree { private: vector<Node> tree; int n; void merge(Node &parent, Node left, Node right) { parent.val = max(left.val, right.val); parent.cnt = left.cnt + right.cnt; if (left.val == parent.val) parent.cnt += left.cnt; if (right.val == parent.val) parent.cnt += right.cnt; } void build(int l, int r, int idx, vector<int> &arr) { if (l == r) { tree[idx] = Node(arr[l]); } else { int mid = (l + r) / 2; build(l, mid, 2 * idx + 1, arr); build(mid + 1, r, 2 * idx + 2, arr); merge(tree[idx], tree[2 * idx + 1], tree[2 * idx + 2]); } } void update(int l, int r, int idx, int pos, int val) { if (l == r) { tree[idx].val -= val; } else { int mid = (l + r) / 2; if (pos <= mid) update(l, mid, 2 * idx + 1, pos, val); else update(mid + 1, r, 2 * idx + 2, pos, val); merge(tree[idx], tree[2 * idx + 1], tree[2 * idx + 2]); } } int query(int l, int r, int idx, int ql, int qr, int val) { if (ql <= l && qr >= r) { return tree[idx].cnt - (tree[idx].val > val ? tree[idx].cnt : 0); } else { int mid = (l + r) / 2; int ans = 0; if (ql <= mid) ans += query(l, mid, 2 * idx + 1, ql, qr, val); if (qr > mid) ans += query(mid + 1, r, 2 * idx + 2, ql, qr, val); return ans; } } public: SegTree(int size) { n = size; tree.resize(4 * size); } void build(vector<int> &arr) { build(0, n - 1, 0, arr); } void update(int pos, int val) { update(0, n - 1, 0, pos, val); } int query(int l, int r, int val) { return query(0, n - 1, 0, l, r, val); } }; int main() { int n, m; cin >> n >> m; vector<int> a(n); for (int i = 0; i < n; ++i) cin >> a[i]; SegTree segTree(n); segTree.build(a); int opt, l, r, x; while (m--) { cin >> opt >> l >> r >> x; --l, --r; if (opt == 1) { segTree.update(l, r, x); } else { cout << segTree.query(l, r, x) << endl; } } return 0; } ``` 这个C++代码实现了题目要求的功能。首先,定义了一个结构体`Node`来存储每个节点的信息,包括当前最大值和小于等于当前最大值的元素个数。然后,定义了一个`SegTree`类来处理区间查询和更新操作。在主函数中,读取输入并构建线段树,接着处理每个操作并输出结果。 [2024-07-18 21:08:10 | AI写代码神器 | 875点数解答]