Submission #88130

#TimeUsernameProblemLanguageResultExecution timeMemory
88130KCSCSterilizing Spray (JOI15_sterilizing)C++14
100 / 100
444 ms70876 KiB
#include <bits/stdc++.h> using namespace std; const int DIM = 100005; struct Node { int mxm; long long sum; } sgt[DIM << 2]; void update1(int nd, int le, int ri, int ps, int vl) { if (le == ri) { sgt[nd] = {vl, vl}; } else { int md = (le + ri) / 2; if (ps <= md) { update1(nd << 1, le, md, ps, vl); } else { update1(nd << 1 | 1, md + 1, ri, ps, vl); } sgt[nd] = {max(sgt[nd << 1].mxm, sgt[nd << 1 | 1].mxm), sgt[nd << 1].sum + sgt[nd << 1 | 1].sum}; } } void update2(int nd, int le, int ri, int st, int en, int k) { if (sgt[nd].mxm == 0 or k == 1) { return; } if (le == ri) { sgt[nd] = {sgt[nd].mxm / k, sgt[nd].mxm / k}; } else { int md = (le + ri) / 2; if (st <= md) { update2(nd << 1, le, md, st, en, k); } if (md < en) { update2(nd << 1 | 1, md + 1, ri, st, en, k); } sgt[nd] = {max(sgt[nd << 1].mxm, sgt[nd << 1 | 1].mxm), sgt[nd << 1].sum + sgt[nd << 1 | 1].sum}; } } long long query(int nd, int le, int ri, int st, int en) { if (st <= le and ri <= en) { return sgt[nd].sum; } else { int md = (le + ri) / 2; if (en <= md) { return query(nd << 1, le, md, st, en); } if (md < st) { return query(nd << 1 | 1, md + 1, ri, st, en); } return query(nd << 1, le, md, st, en) + query(nd << 1 | 1, md + 1, ri, st, en); } } int main(void) { #ifdef HOME freopen("sterilizing.in", "r", stdin); freopen("sterilizing.out", "w", stdout); #endif int n, q, k; cin >> n >> q >> k; for (int i = 1; i <= n; ++i) { int x; cin >> x; update1(1, 1, n, i, x); } while (q--) { int t, x, y; cin >> t >> x >> y; if (t == 1) { update1(1, 1, n, x, y); } if (t == 2) { update2(1, 1, n, x, y, k); } if (t == 3) { cout << query(1, 1, n, x, y) << "\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...