Submission #1256440

#TimeUsernameProblemLanguageResultExecution timeMemory
1256440MisterReaperFood Court (JOI21_foodcourt)C++20
100 / 100
362 ms51440 KiB
// File W.cpp created on 11.08.2025 at 13:49:00 #include <bits/stdc++.h> using i64 = long long; #ifdef DEBUG #include "/home/ahmetalp/Desktop/Workplace/debug.h" #else #define debug(...) void(23) #endif constexpr int max_N = int(250000) + 5; struct node { std::pair<i64, int> mn = {0, 0}; i64 sum = 0, neg = 0, pos = 0; node() {} node(i64 x, int p) { mn = {x, p}; sum = x; neg = std::min(0LL, x); pos = std::max(0LL, x); } } tree[max_N << 1]; node operator+ (const node lhs, const node rhs) { node res; res.mn = std::min(lhs.mn, {rhs.mn.first + lhs.sum, rhs.mn.second}); res.sum = lhs.sum + rhs.sum; res.neg = lhs.neg + rhs.neg; res.pos = lhs.pos + rhs.pos; return res; } #define def int mid = (l + r) >> 1, lv = v + 1, rv = v + ((mid - l + 1) << 1) void build(int v, int l, int r) { if (l == r) { tree[v].mn.second = l; return; } def; build(lv, l, mid); build(rv, mid + 1, r); tree[v] = tree[lv] + tree[rv]; } void modify(int v, int l, int r, int p, node x) { if (l == r) { tree[v] = x; return; } def; if (p <= mid) { modify(lv, l, mid, p, x); } else { modify(rv, mid + 1, r, p, x); } tree[v] = tree[lv] + tree[rv]; } node get(int v, int l, int r, int ql, int qr) { if (ql == l && r == qr) { return tree[v]; } def; if (qr <= mid) { return get(lv, l, mid, ql, qr); } else if (mid + 1 <= ql) { return get(rv, mid + 1, r, ql, qr); } else { return get(lv, l, mid, ql, mid) + get(rv, mid + 1, r, mid + 1, qr); } } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int N, M, Q; std::cin >> N >> M >> Q; std::vector<std::array<i64, 5>> qry(Q); for (int i = 0; i < Q; ++i) { int TP; std::cin >> TP; if (TP == 1) { i64 L, R, K, C; std::cin >> L >> R >> K >> C; --L, --R; qry[i] = {TP, L, R, K, C}; } else if (TP == 2) { i64 L, R, K; std::cin >> L >> R >> K; --L, --R; qry[i] = {TP, L, R, K}; } else { i64 A, B; std::cin >> A >> B; --A; qry[i] = {TP, A, B}; } } build(0, 0, Q); std::vector<std::vector<std::pair<int, int>>> add(N + 1); std::vector<std::vector<int>> ask(N + 1); for (int i = 0; i < Q; ++i) { if (qry[i][0] == 1) { auto[TP, L, R, C, K] = qry[i]; add[L].emplace_back(i, +1); add[R + 1].emplace_back(i, -1); } else if (qry[i][0] == 2) { auto[TP, L, R, K, _] = qry[i]; add[L].emplace_back(i, +2); add[R + 1].emplace_back(i, -2); } else { auto[TP, A, B, _, __] = qry[i]; ask[A].emplace_back(i); } } std::vector<int> ans(Q, -1); for (int i = 0; i < N; ++i) { debug(i); for (auto[j, b] : add[i]) { debug(j, b); if (std::abs(b) == +1) { auto[TP, L, R, C, K] = qry[j]; if (b == +1) { node nd(K, j + 1); modify(0, 0, Q, j + 1, nd); } else { node nd(0, j + 1); modify(0, 0, Q, j + 1, nd); } } else { auto[TP, L, R, K, _] = qry[j]; if (b == +2) { node nd(-K, j + 1); modify(0, 0, Q, j + 1, nd); } else { node nd(0, j + 1); modify(0, 0, Q, j + 1, nd); } } debug(1); } for (auto j : ask[i]) { debug(j); auto[TP, A, B, _, __] = qry[j]; auto nd = get(0, 0, Q, 0, j + 1); int lst = nd.mn.second + 1; debug(lst, nd.mn); if (get(0, 0, Q, lst, j + 1).sum < B) { ans[j] = 0; continue; } i64 src = B - get(0, 0, Q, lst, j + 1).neg; debug(lst, src); auto dfs = [&](auto&& self, int v, int l, int r) -> int { if (r < lst) { return -1; } if (lst <= l && src > tree[v].pos) { src -= tree[v].pos; return -1; } if (l == r) { return l; } def; int res = self(self, lv, l, mid); if (res == -1) { res = self(self, rv, mid + 1, r); } return res; }; int res = dfs(dfs, 0, 0, Q); assert(res > 0 && qry[res - 1][0] == 1); debug(qry[res - 1][3]); ans[j] = qry[res - 1][3]; } } for (int i = 0; i < Q; ++i) { if (ans[i] != -1) { std::cout << ans[i] << '\n'; } } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...