Submission #1133526

#TimeUsernameProblemLanguageResultExecution timeMemory
1133526MunkhturErdenebatSterilizing Spray (JOI15_sterilizing)C++20
0 / 100
5094 ms3864 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...