Submission #94644

#TimeUsernameProblemLanguageResultExecution timeMemory
94644shoemakerjoSterilizing Spray (JOI15_sterilizing)C++14
100 / 100
606 ms10508 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int maxn = 100010; set<int> nonz; //nonzero int N, Q, K; int nums[maxn]; ll seg[maxn*4]; ll query(int qs, int qe, int ss = 1, int se = N, int si = 0) { if (qs > qe || ss > se || qs > se || qe < ss) return 0LL; if (qs <= ss && se <= qe) return seg[si]; int mid = (ss+se)/2; return query(qs, qe, ss, mid, si*2+1) + query(qs, qe, mid+1, se, si*2+2); } void update(int spot, ll val, int ss = 1, int se = N, int si = 0) { if (ss == se) { seg[si] = val; return; } int mid = (ss+se)/2; if (spot <= mid) update(spot, val, ss, mid, si*2+1); else update(spot, val, mid+1, se, si*2+2); seg[si] = seg[si*2+1] + seg[si*2+2]; } void buildtree(int ss = 1, int se = N, int si = 0) { if (ss == se) { seg[si] = nums[ss]; return; } int mid = (ss+se)/2; buildtree(ss, mid, si*2+1); buildtree(mid+1, se, si*2+2); seg[si] = seg[si*2+1] + seg[si*2+2]; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> N >> Q >> K; for (int i = 1; i <= N; i++) { cin >> nums[i]; if (nums[i]) nonz.insert(i); } buildtree(); int tp, a, b; while (Q--) { cin >> tp >> a >> b; if (tp == 1) { update(a, b); nums[a] = b; if (nums[a]) { nonz.insert(a); } } else if (tp == 2) { //this is the big one if (K == 1) continue; auto it = nonz.lower_bound(a); while (it != nonz.end() && *it <= b) { int cur = *it; nums[cur] = nums[cur]/K; // cout << cur << " changed to " << nums[cur] << endl; update(cur, nums[cur]); if (nums[cur] == 0) { it = nonz.erase(it); } else { ++it; } } } else { cout << query(a, b) << '\n'; } } cout.flush(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...