加勒比地道 • 8天前
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;
}
评论:
请先登录,才能进行评论