Submission #973804

#TimeUsernameProblemLanguageResultExecution timeMemory
973804VMaksimoski008Sterilizing Spray (JOI15_sterilizing)C++17
80 / 100
5060 ms10280 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; struct SegTree { int n, k; vector<int> v; vector<ll> sum, mx; SegTree(vector<int> _v, int _k) { n = _v.size(); v = _v; k = _k; sum.resize(4*n+5); mx.resize(4*n+5); build(1, 0, n-1); } void merge(int u) { sum[u] = sum[2*u] + sum[2*u+1]; mx[u] = max(mx[2*u], mx[2*u+1]); } void build(int u, int tl, int tr) { if(tl == tr) { sum[u] = mx[u] = v[tl]; } else { int tm = (tl + tr) / 2; build(2*u, tl, tm); build(2*u+1, tm+1, tr); merge(u); } } void set(int u, int tl, int tr, int p, int v) { if(tl == tr) { sum[u] = mx[u] = v; } else { int tm = (tl + tr) / 2; if(p <= tm) set(2*u, tl, tm, p, v); else set(2*u+1, tm+1, tr, p, v); merge(u); } } void spray(int u, int tl, int tr, int l, int r) { if(tl > tr || l > tr || tl > r || !mx[u]) return ; if(tl == tr) { sum[u] /= k; mx[u] /= k; return ; } int tm = (tl + tr) / 2; spray(2*u, tl, tm, l, r); spray(2*u+1, tm+1, tr, l, r); merge(u); } ll query(int u, int tl, int tr, int l, int r) { if(tl > tr || l > tr || tl > r) return 0; if(l <= tl && tr <= r) return sum[u]; int tm = (tl + tr) / 2; return query(2*u, tl, tm, l, r) + query(2*u+1, tm+1, tr, l, r); } ll query(int l, int r) { return query(1, 0, n-1, l, r); } void set(int p, int v) { set(1, 0, n-1, p, v); } void spray(int l, int r) { spray(1, 0, n-1, l, r); } }; int main() { int n, q, k, t, l, r; cin >> n >> q >> k; vector<int> v(n); for(int &x : v) cin >> x; SegTree tree(v, k); while(q--) { cin >> t >> l >> r; if(t == 1) tree.set(l-1, r); else if(t == 2) tree.spray(l-1, r-1); else cout << tree.query(l-1, r-1) << '\n'; } 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...