比赛 20250527CSP-S模拟 评测结果
题目名称 假期计划 最终得分 0
用户昵称 Galaxy 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2025-05-27 16:16:00
显示代码纯文本
#include <bits/stdc++.h>
#include <cstdio>
using namespace std;
using ll = long long;
const ll lim = (ll)1e18;
const int man = 100000 + 5;

int n, m, q;
ll a[man], b[man];

template <typename T>
struct SegTreeA {
	struct Node {
		int l, r;
		T pmax = -lim;
		T pmin = lim;
		T nmax = -lim;
		T nmin = lim;
		bool zero = false;
	};
	std::vector<Node> t;

	void pushup(int i) {
		auto &L = t[i << 1], &R = t[i << 1 | 1], &O = t[i];
		O.pmax = max(L.pmax, R.pmax);
		O.pmin = min(L.pmin, R.pmin);
		O.nmax = max(L.nmax, R.nmax);
		O.nmin = min(L.nmin, R.nmin);
		O.zero = L.zero || R.zero;
	}

	void build_privatelt(int l, int r, int i) {
		t[i].l = l;
		t[i].r = r;
		if (l == r) {
			T v = a[l];
			if (v > 0) {
				t[i].pmax = t[i].pmin = v;
			} else if (v < 0) {
				t[i].nmax = t[i].nmin = v;
			} else {
				t[i].zero = true;
			}
			return;
		}
		int mid = (l + r) >> 1;
		build_privatelt(l, mid, i << 1);
		build_privatelt(mid + 1, r, i << 1 | 1);
		pushup(i);
	}

	void build(int l, int r, int i, int size) {
		t.resize((size + 1) << 2);
		build_privatelt(l, r, 1);
	}

	Node query(int l, int r, int i) {
		if (l <= t[i].l && t[i].r <= r) return t[i];
		int mid = (t[i].l + t[i].r) >> 1;
		if (r <= mid)
			return query(l, r, i << 1);
		else if (l > mid)
			return query(l, r, i << 1 | 1);
		else {
			Node L = query(l, r, i << 1), R = query(l, r, i << 1 | 1), res;
			res.pmax = max(L.pmax, R.pmax);
			res.pmin = min(L.pmin, R.pmin);
			res.nmax = max(L.nmax, R.nmax);
			res.nmin = min(L.nmin, R.nmin);
			res.zero = L.zero || R.zero;
			return res;
		}
	}
};

template <typename T>
struct SegTreeB {
	struct Node {
		int l, r;
		T mx = -lim, mn = lim;
	};

	std::vector<Node> t;

	void build_privately(int l, int r, int i) {
		t[i].l = l;
		t[i].r = r;
		if (l == r) {
			t[i].mx = t[i].mn = b[l];
			return;
		}
		int mid = (l + r) >> 1;
		build_privately(l, mid, i << 1);
		build_privately(mid + 1, r, i << 1 | 1);
		t[i].mx = max(t[i << 1].mx, t[i << 1 | 1].mx);
		t[i].mn = min(t[i << 1].mn, t[i << 1 | 1].mn);
	}

	void build(int l, int r, int i, int size) {
		t.resize((size + 1) << 2);
		build_privately(l, r, 1);
	}

	Node query(int l, int r, int i) {
		if (l <= t[i].l && t[i].r <= r) return t[i];
		int mid = (t[i].l + t[i].r) >> 1;
		if (r <= mid)
			return query(l, r, i << 1);
		else if (l > mid)
			return query(l, r, i << 1 | 1);
		else {
			Node L = query(l, r, i << 1), R = query(l, r, i << 1 | 1), res;
			res.mx = max(L.mx, R.mx);
			res.mn = min(L.mn, R.mn);
			return res;
		}
	}
};

SegTreeA<ll> treeA;
SegTreeB<ll> treeB;

int main() {
	std::cin.tie(nullptr)->sync_with_stdio(false);
	freopen("csp2022_game.in", "r", stdin);
	freopen("csp2022_game.out", "w", stdout);
	cin >> n >> m >> q;
	for (int i = 1; i <= n; ++i)
		cin >> a[i];
	for (int j = 1; j <= m; ++j)
		cin >> b[j];
	treeA.build(1, n, 1, n);
	treeB.build(1, m, 1, m);

	while (q--) {
		int l1, r1, l2, r2;
		cin >> l1 >> r1 >> l2 >> r2;
		auto A = treeA.query(l1, r1, 1);
		auto B = treeB.query(l2, r2, 1);

		ll ans = -lim;
		if (A.pmax != -lim) {
			if (B.mn >= 0) {
				ans = max(ans, A.pmax * B.mn);
			} else if (A.pmin != lim) {
				ans = max(ans, A.pmin * B.mn);
			}
		}
		
		if (B.mx >= 0) {
			if (A.nmax != -lim) {
				ans = max(ans, A.nmax * B.mx);
			}
		} else {
			if (A.nmin != lim) {
				ans = max(ans, A.nmin * B.mx);
			}
		}
		if (A.zero) {
			ans = max(ans, 0LL);
		}

		cout << ans << "\n";
	}
	return 0;
}