Submission #570261

#TimeUsernameProblemLanguageResultExecution timeMemory
570261dutinmeowFood Court (JOI21_foodcourt)C++17
100 / 100
528 ms64160 KiB
#include <bits/stdc++.h>
using namespace std;

#pragma region y_combinator

#ifndef Y_COMBINATOR_HPP
#define Y_COMBINATOR_HPP

template<class Fun>
class y_combinator_result {
	Fun fun_;
public:
	template<class T>
	explicit y_combinator_result(T &&fun) : fun_(std::forward<T>(fun)) {}

	template<class ...Args>
	decltype(auto) operator()(Args &&...args) {
		return fun_(std::ref(*this), std::forward<Args>(args)...);
	}
};

template<class Fun>
decltype(auto) y_combinator(Fun &&fun) {
	return y_combinator_result<std::decay_t<Fun>>(std::forward<Fun>(fun));
}

#endif

#pragma endregion y_combinator

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);

	int N, M, Q;
	cin >> N >> M >> Q;

	vector<int> typ(Q), grp(Q);
	vector<long long> num(Q);
	vector<vector<int>> qlb(N), qmb(N), qrb(N);
	for (int i = 0; i < Q; i++) {
		int t;
		cin >> t;
		typ[i] = t;
		if (t == 1) {
			int l, r, c;
			long long k;
			cin >> l >> r >> c >> k;
			l--, r--;
			qlb[l].push_back(i);
			qrb[r].push_back(i);
			grp[i] = c;
			num[i] = k;
		} else if (t == 2) {
			int l, r;
			long long k;
			cin >> l >> r >> k;
			l--, r--;
			qlb[l].push_back(i);
			qrb[r].push_back(i);
			num[i] = k;
		} else if (t == 3) {
			int a;
			long long b;
			cin >> a >> b;
			a--;
			qmb[a].push_back(i);
			num[i] = b;
		}
	}

	vector<long long> suf_sum(4 * Q, 0), all_sum(4 * Q, 0), add_sum(4 * Q, 0);

	// updates index i in segment tree to v
	auto seg_update = y_combinator([&](auto seg_update, int i, int v, int t, int tl, int tr) -> void {
		if (tl == tr) {
			assert(tl == i);
			all_sum[t] = v;
			suf_sum[t] = add_sum[t] = max(v, 0);
			return;
		}
		int tm = (tl + tr) / 2;
		if (i <= tm)
			seg_update(i, v, t * 2, tl, tm);
		else 
			seg_update(i, v, t * 2 + 1, tm + 1, tr);
		suf_sum[t] = max(suf_sum[t * 2] + all_sum[t * 2 + 1], suf_sum[t * 2 + 1]);
		all_sum[t] = all_sum[t * 2] + all_sum[t * 2 + 1];
		add_sum[t] = add_sum[t * 2] + add_sum[t * 2 + 1];
	});

	// finds maximum suffix sum that ends at index i (number of customers)
	auto seg_max_suf = y_combinator([&](auto seg_max_suf, int i, int t, int tl, int tr) -> pair<long long, long long> {
		if (i < tl)
			return make_pair(0, 0);
		if (tr <= i)
			return make_pair(suf_sum[t], all_sum[t]);
		int tm = (tl + tr) / 2;
		auto [lsuf, lall] = seg_max_suf(i, t * 2, tl, tm);
		auto [rsuf, rall] = seg_max_suf(i, t * 2 + 1, tm + 1, tr);
		return make_pair(max(lsuf + rall, rsuf), lall + rall);
	});

	// finds sum of first i queries that are positive
	auto seg_add_sum = y_combinator([&](auto seg_add_sum, int i, int t, int tl, int tr) -> long long {
		if (i < tl)
			return 0;
		if (tr <= i)
			return add_sum[t];
		int tm = (tl + tr) / 2;
		return seg_add_sum(i, t * 2, tl, tm) + seg_add_sum(i, t * 2 + 1, tm + 1, tr);
	});

	// find index of query where kth customer arrived
	auto seg_find_index = y_combinator([&](auto seg_find_index, long long k, int t, int tl, int tr) -> int {
		if (tl == tr)
			return tl;
		int tm = (tl + tr) / 2;
		if (k <= add_sum[t * 2])
			return seg_find_index(k, t * 2, tl, tm);
		else 
			return seg_find_index(k - add_sum[t * 2], t * 2 + 1, tm + 1, tr);
	});

	vector<int> ans(Q);
	for (int i = 0; i < N; i++) {
		for (int q : qlb[i]) {
			if (typ[q] == 1)
				seg_update(q, num[q], 1, 0, Q - 1);
			else if (typ[q] == 2)
				seg_update(q, -num[q], 1, 0, Q - 1);
		}
		for (int q : qmb[i]) {
			long long b = num[q], f = seg_max_suf(q, 1, 0, Q - 1).first;
			if (f < b) {
				ans[q] = 0;
				continue;
			}
			long long d = f - b, s = seg_add_sum(q, 1, 0, Q - 1);
			int a = seg_find_index(s - d, 1, 0, Q - 1);
			ans[q] = grp[a];
		}
		for (int q : qrb[i]) {
			seg_update(q, 0, 1, 0, Q - 1);
		}
	}

	for (int i = 0; i < Q; i++)
		if (typ[i] == 3)
			cout << ans[i] << '\n';
}

Compilation message (stderr)

foodcourt.cpp:4: warning: ignoring '#pragma region y_combinator' [-Wunknown-pragmas]
    4 | #pragma region y_combinator
      | 
foodcourt.cpp:29: warning: ignoring '#pragma endregion y_combinator' [-Wunknown-pragmas]
   29 | #pragma endregion y_combinator
      |
#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...