https://www.luogu.com.cn/record/93574854
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 100005;
int n, m, q;
LL a[2][MAXN];
struct node {
int ha0, haz, haf;
LL maxz, minz, maxf, minf;
}t[5][MAXN * 4];
bool flag;
node make_node(int ha0, int haz, int haf, LL maxz, LL minz, LL maxf, LL minf) {
node abc;
abc.ha0 = ha0; abc.haz = haz; abc.haf = haf; abc.maxz = maxz;
abc.minz = minz; abc.maxf = maxf; abc.minf = minf;
return abc;
}
node pushup(node ax, node by) {
node cz;
cz.ha0 = ax.ha0 | by.ha0;
cz.haz = ax.haz | by.haz;
cz.haf = ax.haf | by.haf;
cz.maxz = max(ax.maxz, by.maxz);
cz.minz = min(ax.minz, by.minz);
cz.maxf = max(ax.maxf, by.maxf);
cz.minf = min(ax.minf, by.minf);
return cz;
}
void build(int u, int l, int r, int i) {
if(l == r) {
t[i][u] = make_node(0, 0, 0, -1e9 - 7, 1e9 + 7, -1e9 - 7, 1e9 + 7);
if(a[i][l] == 0) {
t[i][u].ha0 = 1;
} else if(a[i][l] < 0) {
t[i][u].haf = 1; t[i][u].maxf = max(t[i][u].maxf, a[i][l]);
t[i][u].minf = min(t[i][u].minf, a[i][l]);
} else if(a[i][l] > 0) {
t[i][u].haz = 1; t[i][u].maxz = max(t[i][u].maxz, a[i][l]);
t[i][u].minz = min(t[i][u].minz, a[i][l]);
}
return ;
}
int mid = (l + r) >> 1;
build(u << 1, l, mid, i);
build(u << 1 | 1, mid + 1, r, i);
t[i][u] = pushup(t[i][u << 1], t[i][u << 1 | 1]);
}
node query(int u, int l, int r, int x, int y, int i) {
if(x <= l && r <= y) return t[i][u];
int mid = (l + r) >> 1, flag = 0;
node aans;
if(x <= mid) aans = query(u << 1, l, mid, x, y, i), flag = 1;
if(y > mid) {
node xx = query(u << 1 | 1, mid + 1, r, x, y, i);
if(flag) aans = pushup(aans, xx);
else aans = xx;
}
return aans;
}
int main() {
//freopen("game.in", "r", stdin);
//freopen("game.out", "w", stdout);
scanf("%d%d%d", &n, &m, &q);
for(int i = 1; i <= n; i++) scanf("%lld", &a[0][i]);
for(int i = 1; i <= m; i++) scanf("%lld", &a[1][i]);
build(1, 1, n, 0);
build(1, 1, m, 1);
//cout << t[1][1].maxz << endl;
while(q--) {
int l1, r1, l2, r2;
scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
node A = query(1, 1, n, l1, r1, 0);
node B = query(1, 1, m, l2, r2, 1);
//LL maxa = max(A.maxz, A.maxf), mina = (A.minz, A.minf);
//printf("=> %d %d %d %lld %lld %lld %lld\n", A.ha0, A.haz, A.haf, A.maxz, A.minz, A.maxf, A.minf);
//printf("=> %d %d %d %lld %lld %lld %lld\n", B.ha0, B.haz, B.haf, B.maxz, B.minz, B.maxf, B.minf);
LL ans;
if(B.haz == 1 && B.haf == 0) {
if(A.haz == 1) ans = A.maxz * B.minz;
else ans = A.maxf * B.maxz;
} else if(B.haz == 0 && B.haf == 1) {
if(A.haf == 1) ans = A.minf * B.maxf;
else ans = A.minz * B.minf;
} else if(B.haz == 1 && B.haf == 1) {
LL a1 = A.minz * B.minf;
LL a2 = A.maxf * B.maxz;
ans = max(a1, a2);
}
if(A.ha0 == 1 && ans < 0) ans = 0;
if(B.ha0 == 1 && ans > 0) ans = 0;
printf("%lld\n", ans);
}
return 0;
}