제출 #1311096

#제출 시각아이디문제언어결과실행 시간메모리
1311096chithanhnguyenSterilizing Spray (JOI15_sterilizing)C++20
100 / 100
122 ms7808 KiB
/* Author: Nguyen Chi Thanh - High School for the Gifted - VNU.HCM (i2528) */ #include <bits/stdc++.h> using namespace std; #define int long long #define ull unsigned long long #define ld long double #define pii pair<int, int> #define fi first #define se second #define __builtin_popcount __builtin_popcountll #define all(x) (x).begin(), (x).end() #define BIT(x, i) (((x) >> (i)) & 1) #define MASK(x) ((1ll << (x))) #define debug(a, l, r) for (int _i = (l); _i <= (r); ++_i) cout << (a)[_i] << ' '; cout << '\n'; struct Node{ int mx, sum; }; Node operator + (Node &a, Node &b) { Node res = {max(a.mx, b.mx), a.sum + b.sum}; return res; } struct SegmentTree{ int n; vector<Node> st; void build(int id, int l, int r, int a[]) { if (l == r) { st[id] = {a[l], a[l]}; return; } int mid = (l + r) >> 1; build(id << 1, l, mid, a); build(id << 1 | 1, mid + 1, r, a); st[id] = st[id << 1] + st[id << 1 | 1]; } SegmentTree(int _n, int a[]) : n(_n) { st.resize(4 * n + 5); build(1, 1, n, a); } void update(int id, int l, int r, int pos, int val) { if (pos < l || pos > r) return; if (l == r) { st[id] = {val, val}; return; } int mid = (l + r) >> 1; update(id << 1, l, mid, pos, val); update(id << 1 | 1, mid + 1, r, pos, val); st[id] = st[id << 1] + st[id << 1 | 1]; } void update_range(int id, int l, int r, int u, int v, int k) { if (v < l || r < u) return; if (st[id].mx == 0) return; if (l == r) { int v = st[id].sum; st[id] = {v / k, v / k}; return; } int mid = (l + r) >> 1; update_range(id << 1, l, mid, u, v, k); update_range(id << 1 | 1, mid + 1, r, u, v, k); st[id] = st[id << 1] + st[id << 1 | 1]; } Node get(int id, int l, int r, int u, int v) { if (v < l || r < u) return {0, 0}; if (u <= l && r <= v) return st[id]; int mid = (l + r) >> 1; Node get1 = get(id << 1, l, mid, u, v); Node get2 = get(id << 1 | 1, mid + 1, r, u, v); return get1 + get2; } void update(int pos, int val) {update(1, 1, n, pos, val);} void update_range(int u, int v, int k) { if (k == 1) return; update_range(1, 1, n, u, v, k); } Node get(int u, int v) {return get(1, 1, n, u, v);} }; const int MAXN = 1e5 + 5; int n, q, k, a[MAXN]; void init() { cin >> n >> q >> k; for (int i = 1; i <= n; ++i) cin >> a[i]; } void solve() { SegmentTree seg(n, a); while (q--) { int type, l, r; cin >> type >> l >> r; if (type == 1) seg.update(l, r); else if (type == 2) seg.update_range(l, r, k); else cout << seg.get(l, r).sum << '\n'; } } signed main() { #ifdef NCTHANH freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif ios_base::sync_with_stdio(0); cin.tie(nullptr); cout.tie(nullptr); init(); solve(); 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...