#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
const int MAXN = 100005;
struct SegmentTree {
vector<long long> tree, lazy;
int n;
SegmentTree(int size) : n(size) {
tree.assign(4 * n, 0);
lazy.assign(4 * n, 0);
}
void build(const vector<int>& arr, int node, int start, int end) {
if (start == end) {
tree[node] = arr[start];
} else {
int mid = (start + end) / 2;
build(arr, 2 * node, start, mid);
build(arr, 2 * node + 1, mid + 1, end);
tree[node] = tree[2 * node] + tree[2 * node + 1];
}
}
void propagate(int node, int start, int end) {
if (lazy[node] != 0) {
tree[node] = lazy[node] * (end - start + 1);
if (start != end) {
lazy[2 * node] = lazy[node];
lazy[2 * node + 1] = lazy[node];
}
lazy[node] = 0;
}
}
void updateRange(int l, int r, int value, int node, int start, int end) {
propagate(node, start, end);
if (start > end || start > r || end < l)
return;
if (start >= l && end <= r) {
lazy[node] = value;
propagate(node, start, end);
return;
}
int mid = (start + end) / 2;
updateRange(l, r, value, 2 * node, start, mid);
updateRange(l, r, value, 2 * node + 1, mid + 1, end);
tree[node] = tree[2 * node] + tree[2 * node + 1];
}
long long queryRange(int l, int r, int node, int start, int end) {
propagate(node, start, end);
if (start > end || start > r || end < l)
return 0;
if (start >= l && end <= r)
return tree[node];
int mid = (start + end) / 2;
return queryRange(l, r, 2 * node, start, mid) +
queryRange(l, r, 2 * node + 1, mid + 1, end);
}
};
int main() {
int N, Q, K;
cin >> N >> Q >> K;
vector<int> bacteria(N + 1);
for (int i = 1; i <= N; ++i) {
cin >> bacteria[i];
}
SegmentTree segTree(N);
segTree.build(bacteria, 1, 1, N);
vector<long long> results;
for (int i = 0; i < Q; ++i) {
int op;
cin >> op;
if (op == 1) {
int a, b;
cin >> a >> b;
segTree.updateRange(a, a, b, 1, 1, N);
} else if (op == 2) {
int l, r;
cin >> l >> r;
for (int j = l; j <= r; ++j) {
long long current = segTree.queryRange(j, j, 1, 1, N);
segTree.updateRange(j, j, current / K, 1, 1, N);
}
} else if (op == 3) {
int l, r;
cin >> l >> r;
results.push_back(segTree.queryRange(l, r, 1, 1, N));
}
}
for (auto res : results) {
cout << res << endl;
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |