Submission #1118571

#TimeUsernameProblemLanguageResultExecution timeMemory
1118571SharkyFood Court (JOI21_foodcourt)C++17
100 / 100
554 ms60080 KiB
#include "bits/stdc++.h" using namespace std; #define int long long const int N = 2.5e5 + 10; vector<pair<int, int>> qry[N], ev[N]; // ev: index, cnt int qc = 0, ans[N], grp[N]; struct Node { int pmin = 0, sum = 0, add = 0; } dummy; struct SegTree { int size = 1; vector<Node> seg, lazy; void init(int n) { while (size < n) size *= 2; seg.assign(2 * size + 10, dummy); lazy.assign(2 * size + 10, dummy); } void push(int id) { seg[id].pmin = min(seg[id].pmin, seg[id].sum + lazy[id].pmin); seg[id].sum += lazy[id].sum; seg[id].add += lazy[id].add; if (id < size) for (int i = 0; i < 2; i++) { lazy[id * 2 + i].pmin = min(lazy[id * 2 + i].pmin, lazy[id * 2 + i].sum + lazy[id].pmin); lazy[id * 2 + i].sum += lazy[id].sum; lazy[id * 2 + i].add += lazy[id].add; } lazy[id].sum = lazy[id].pmin = lazy[id].add = 0; } void update(int ql, int qr, int v, int l, int r, int id) { push(id); if (qr < l || r < ql) return; if (ql <= l && r <= qr) { lazy[id].add = max(0LL, v); lazy[id].sum = v; lazy[id].pmin = min(0LL, v); push(id); return; } int mid = (l + r) / 2; update(ql, qr, v, l, mid, id * 2); update(ql, qr, v, mid + 1, r, id * 2 + 1); } Node query(int pos, int l, int r, int id) { push(id); if (l == r) return seg[id]; int mid = (l + r) / 2; if (pos <= mid) return query(pos, l, mid, id * 2); return query(pos, mid + 1, r, id * 2 + 1); } } ST; struct SegTreeWalk { int size = 1; vector<int> seg; void init(int n) { while (size < n) size *= 2; seg.assign(2 * size + 10, 0); } void update(int pos, int val, int l, int r, int id) { if (l == r) { seg[id] += val; return; } int mid = (l + r) / 2; if (pos <= mid) update(pos, val, l, mid, id * 2); else update(pos, val, mid + 1, r, id * 2 + 1); seg[id] = seg[id * 2] + seg[id * 2 + 1]; } int find(int x, int l, int r, int id) { if (seg[id] < x) return 0; if (l == r) return l; int mid = (l + r) / 2; if (seg[id * 2] >= x) return find(x, l, mid, id * 2); return find(x - seg[id * 2], mid + 1, r, id * 2 + 1); } } seg; int32_t main() { ios::sync_with_stdio(0); cin.tie(0); int n, m, q; cin >> n >> m >> q; ST.init(n+1); seg.init(q+1); for (int i = 1; i <= q; i++) { int type; cin >> type; if (type == 1) { int l, r, c, k; cin >> l >> r >> c >> k; grp[i] = c; ST.update(l, r, k, 1, n, 1); ev[l].push_back({i, k}); ev[r+1].push_back({i, -k}); } else if (type == 2) { int l, r, k; cin >> l >> r >> k; ST.update(l, r, -k, 1, n, 1); } else { int id, x; cin >> id >> x; ++qc; auto [pmin, sum, add] = ST.query(id, 1, n, 1); if (sum - pmin >= x) qry[id].push_back({add - sum + pmin + x, qc}); } } for (int i = 1; i <= n; i++) { for (auto& [id, add] : ev[i]) seg.update(id, add, 1, q, 1); for (auto& [k, id] : qry[i]) ans[id] = grp[seg.find(k, 1, q, 1)]; } for (int i = 1; i <= qc; i++) cout << ans[i] << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...