bud

加勒比地道  •  8天前


include <bits/stdc++.h>

using namespace std; const int INF = 2 * 1e9; int xl[100001], xq[100001]; int xlmin[100001][22], xlmax[100001][22]; int xqmin[100001][22], xqmax[100001][22]; int xlminz[100001][22], xlmaxf[100001][22];

int main() {

ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m, q;
cin >> n >> m >> q;
for (int i = 1; i <= n; i++)
	cin >> xl[i];
for (int j = 1; j <= m; j++)
	cin >> xq[j];
for (int i = 1; i <= n; i++) {
	xlmin[i][0] = xl[i];
	xlmax[i][0] = xl[i];
	xlminz[i][0] = (xl[i] >= 0) ? xl[i] : INF;
	xlmaxf[i][0] = (xl[i] <= 0) ? xl[i] : -INF;
}
for (int i = 1; i <= m; i++) {
	xqmin[i][0] = xq[i];
	xqmax[i][0] = xq[i];
}
for (int k = 1; (1 << k) <= n; k++) {
	for (int i = 1; i + (1 << k) - 1 <= n; i++) {
		xlmin[i][k] = min(xlmin[i][k - 1], xlmin[i + (1 << (k - 1))][k - 1]);
		xlmax[i][k] = max(xlmax[i][k - 1], xlmax[i + (1 << (k - 1))][k - 1]);
		xlminz[i][k] = min(xlminz[i][k - 1], xlminz[i + (1 << (k - 1))][k - 1]);
		xlmaxf[i][k] = max(xlmaxf[i][k - 1], xlmaxf[i + (1 << (k - 1))][k - 1]);
	}
}
for (int k = 1; (1 << k) <= m; k++) {
	for (int i = 1; i + (1 << k) - 1 <= m; i++) {
		xqmin[i][k] = min(xqmin[i][k - 1], xqmin[i + (1 << (k - 1))][k - 1]);
		xqmax[i][k] = max(xqmax[i][k - 1], xqmax[i + (1 << (k - 1))][k - 1]);
	}
}
while (q--) {
	int l1, r1, l2, r2;
	cin >> l1 >> r1 >> l2 >> r2;
	int k1 = __builtin_clz(1) - __builtin_clz(r1 - l1 + 1);
	int k2 = __builtin_clz(1) - __builtin_clz(r2 - l2 + 1);

	int xlminv = min(xlmin[l1][k1], xlmin[r1 - (1 << k1) + 1][k1]);
	int xlmaxv = max(xlmax[l1][k1], xlmax[r1 - (1 << k1) + 1][k1]);
	int xqminv = min(xqmin[l2][k2], xqmin[r2 - (1 << k2) + 1][k2]);
	int xqmaxv = max(xqmax[l2][k2], xqmax[r2 - (1 << k2) + 1][k2]);

	if (xlmaxv <= 0 && xqmaxv >= 0) {
		cout << 1LL * xlmaxv *xqmaxv << endl;
	} else if (xqminv >= 0 && xlmaxv >= 0) {
	cout << 1LL * xlmaxv *xqminv << endl;
	} else if (xlminv >= 0 && xqminv <= 0) {
		cout << 1LL * xlminv *xqminv << endl;
	} else if (xqmaxv <= 0 && xlminv <= 0) {
	cout << 1LL * xlminv *xqmaxv << endl;
	} else {
		int minz = min(xlminz[l1][k1], xlminz[r1 - (1 << k1) + 1][k1]);
		int maxf = max(xlmaxf[l1][k1], xlmaxf[r1 - (1 << k1) + 1][k1]);
		cout << max(1LL * minz * xqminv, 1LL * maxf * xqmaxv) << endl;

	}
}
return 0;

}


评论:

请先登录,才能进行评论