自己用DEV C++可以过,但是这里编译过不了
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iostream>
#define LL long long
using namespace std;
const int N = 1e5 + 5;
int max(int a, int b) {
return a > b ? a : b;
}
int min(int a, int b) {
return a < b ? a : b;
}
LL queryMax(int l, int r, LL arr[N][21]) {
int k = log2(r - l + 1);
return max(arr[l][k], arr[r - (1 << k) + 1][k]);
}
LL queryMin(int l, int r, LL arr[N][21]) {
int k = log2(r - l + 1);
return min(arr[l][k], arr[r - (1 << k) + 1][k]);
}
int n, m, q;
LL a[N], b[N];
LL amx[N][21], amn[N][21], apn[N][21], anx[N][21], bmx[N][21], bmn[N][21];
const LL pi = LONG_LONG_MAX, ni = LONG_LONG_MIN;
int main() {
//printf("%lld", LONG_LONG_MAX);
scanf("%d%d%d", &n, &m, &q);
for (int i = 1; i <= n; i++) {
LL x;
scanf("%lld", &x);
amx[i][0] = amn[i][0] = x;
anx[i][0] = (x < 0 ? x : ni);
apn[i][0] = (x >= 0 ? x : pi);
}
for (int i = 1; i <= m; i++) {
LL x;
scanf("%lld", &x);
bmx[i][0] = bmn[i][0] = x;
}
for (int j = 1; j <= 21; j++) {
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
int p = i + (1 << (j - 1));
amx[i][j] = max(amx[i][j - 1], amx[p][j - 1]);
anx[i][j] = max(anx[i][j - 1], anx[p][j - 1]);
amn[i][j] = min(amn[i][j - 1], amn[p][j - 1]);
apn[i][j] = min(apn[i][j - 1], apn[p][j - 1]);
}
}
for (int j = 1; j <= 21; j++) {
for (int i = 1; i + (1 << j) - 1 <= m; i++) {
int p = i + (1 << (j - 1));
bmx[i][j] = max(bmx[i][j - 1], bmx[p][j - 1]);
bmn[i][j] = min(bmn[i][j - 1], bmn[p][j - 1]);
}
}
while (q--) {
int la, ra, lb, rb;
scanf("%d%d%d%d", &la, &ra, &lb, &rb);
LL amax = queryMax(la, ra, amx),
amin = queryMin(la, ra, amn),
bmax = queryMax(lb, rb, bmx),
bmin = queryMin(lb, rb, bmn),
anmax = queryMax(la, ra, anx),
apmin = queryMin(la, ra, apn);
//cout << amax << ' ' << amin << ' ' << bmax << ' ' << bmin << ' ' << anmax << ' ' << apmin << " debug" << endl;
if (amin >= 0) {
//if (bmin >= 0) printf("%d")
printf("%lld\n", bmin >= 0 ? amax * bmin : amin * bmin);
}
else if (amax < 0) printf("%lld\n", bmax >= 0 ? amax * bmax : amin * bmax);
else {
if (bmin >= 0) printf("%lld\n", amax * bmin);
else if (bmax < 0) printf("%lld\n", amin * bmax);
else {
printf("%lld\n", max(apmin * bmin, anmax * bmax));
}
}
}
return 0;
}