제출 #750106

#제출 시각아이디문제언어결과실행 시간메모리
750106Muaath_5Sterilizing Spray (JOI15_sterilizing)C++17
0 / 100
124 ms6676 KiB
#include <bits/stdc++.h> #define ll long long #define umin(x, y) x = min(x, y) #define sq(x) ((x)*(x)) using namespace std; const int N = 1e5+1; int n, q, k, c[N]; ll tree[4 * N]; ll modsum[4 * N]; int lazy[4 * N]; inline void pushdown(int node) { if (lazy[node]) { lazy[node * 2] += lazy[node]; lazy[node * 2 + 1] += lazy[node]; modsum[node] /= pow(k, lazy[node]); tree[node] = modsum[node]; lazy[node] = 0; } } void build(int l=0, int r=N-1, int node=1) { if (l == r) { tree[node] = c[l]; modsum[node] = c[l] - (c[l] % k); return; } const int mid = (l + r) / 2; build(l, mid, node*2); build(mid + 1, r, node*2+1); tree[node] = tree[node * 2] + tree[node * 2 + 1]; modsum[node] = modsum[node * 2] + modsum[node * 2 + 1]; } void update(int idx, int val, int l =0, int r = N-1, int node=1) { if (l == r) { tree[node] = val; modsum[node] = val - (val % k); return; } pushdown(node); const int mid = (l + r) / 2; if (idx <= mid) update(idx, val, l, mid, node*2); else update(idx, val, mid + 1, r, node*2+1); tree[node] = tree[node * 2] + tree[node * 2 + 1]; modsum[node] = modsum[node * 2] + modsum[node * 2 + 1]; } void lazy_update(int ql, int qr, int l=0, int r=N-1, int node=1) { pushdown(node); if (r < ql || l > qr) return; if (ql <= l && r <= qr) { lazy[node]++; pushdown(node); return; } const int mid = (l + r) / 2; lazy_update(ql, qr, l, mid, node * 2); lazy_update(ql, qr, mid + 1, r, node * 2 + 1); tree[node] = tree[node * 2] + tree[node * 2 + 1]; } ll query(int ql, int qr, int l=0, int r=N-1, int node = 1) { pushdown(node); if (r < ql || l > qr) return 0; if (ql <= l && r <= qr) return tree[node]; const int mid = (l + r) / 2; return query(ql, qr, l, mid, node * 2) + query(ql, qr, mid + 1, r, node * 2 + 1); } int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin >> n >> q >> k; for (int i = 0; i < n; cin >> c[i++]); build(); while (q--) { int cmd, l, r; cin >> cmd >> l >> r; if (cmd == 1) update(l - 1, r); else if (cmd == 2) lazy_update(l - 1, r - 1); else cout << query(l - 1, r - 1) << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...