제출 #1265316

#제출 시각아이디문제언어결과실행 시간메모리
1265316tvgkFood Court (JOI21_foodcourt)C++20
21 / 100
282 ms39720 KiB
#include<bits/stdc++.h> using namespace std; #define task "a" #define se second #define fi first #define ll long long #define ii pair<ll, ll> const long mxN = 25e4 + 7; struct node { ll sum, pen, inc; }; int n, m, q, c[mxN]; ll ans[mxN]; node tree[mxN * 4]; vector<ii> vc[mxN], querry[mxN]; node Merge(node u, node v) { node res; res.sum = u.sum + v.sum; res.pen = min(u.pen, u.sum + v.pen); res.inc = u.inc + v.inc; return res; } void Upd(int vt, int val, int j = 1, int l = 1, int r = q) { if (l > vt || vt > r) return; if (l == r) { tree[j].sum = val; tree[j].pen = min(0, val); tree[j].inc = max(0, val); return; } int mid = (l + r) / 2; Upd(vt, val, j * 2, l, mid); Upd(vt, val, j * 2 + 1, mid + 1, r); tree[j] = Merge(tree[j * 2], tree[j * 2 + 1]); } node Get(int vt, int j = 1, int l = 1, int r = q) { if (vt < l) return node(); if (r <= vt) return tree[j]; int mid = (l + r) / 2; return Merge(Get(vt, j * 2, l, mid), Get(vt, j * 2 + 1, mid + 1, r)); } int Walk(ll& tmp, int j = 1, int l = 1, int r = q) { if (tmp <= 0) return 0; if (tree[j].inc < tmp) { tmp -= tree[j].inc; return 0; } if (l == r) { tmp = 0; return c[l]; } int mid = (l + r) / 2; return max(Walk(tmp, j * 2, l, mid), Walk(tmp, j * 2 + 1, mid + 1, r)); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen(task".INP", "r", stdin); //freopen(task".OUT", "w", stdout); cin >> n >> m >> q; for (int i = 1; i <= q; i++) { int tt; cin >> tt; if (tt == 1) { int l, r, num; cin >> l >> r >> c[i] >> num; vc[l].push_back({i, num}); vc[r + 1].push_back({i, 0}); } else if (tt == 2) { int l, r, num; cin >> l >> r >> num; vc[l].push_back({i, -num}); vc[r + 1].push_back({i, 0}); } else { ll vt, stt; cin >> vt >> stt; querry[vt].push_back({i, stt}); } ans[i] = -1; } for (int i = 1; i <= n; i++) { for (ii j : vc[i]) Upd(j.fi, j.se); for (ii j : querry[i]) { node tmp = Get(j.fi); ll del = tmp.sum - tmp.pen - j.se + 1; ans[j.fi] = Walk(del); } } for (int i = 1; i <= q; i++) if (ans[i] >= 0) 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...