RT,对拍拍了好久也找不出,但是洛谷测出来75,INFOJ上ac的了
对不起代码很长
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define up(i, a, b) for (int i = a; i <= b; i++)
#define dn(i, a, b) for (int i = a; i >= b; i--)
using namespace std;
typedef long long ll;
int read() {
int x = 0, f = 1;char ch = getchar();
while (ch < '0' || ch > '9') {if (ch == '-') f = -1;ch = getchar();}
while (ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();}
return x * f;
}
const int N = 1e5 + 5, INF = 1e9 + 5;
const ll INFF = 4e18;
int n, m, q, a[N][2];
struct node{
int l, r, mx[2], mi[2];
bool ling;
};
struct Seg_Tree{
node t[N << 3];
#define k1 (k << 1)
#define k2 (k << 1 | 1)
void push_up(int k) {
t[k].ling = (t[k1].ling | t[k2].ling);
up(i, 0, 1) t[k].mx[i] = max(t[k1].mx[i], t[k2].mx[i]), t[k].mi[i] = min(t[k1].mi[i], t[k2].mi[i]);
}
void build(int k, int l, int r, int tp) {
t[k].l = l, t[k].r = r;
up(i, 0, 1) t[k].mx[i] = -INF, t[k].mi[i] = INF;
if (l == r) {
int now = a[l][tp];
if (now == 0) t[k].ling = 1;
else if (now > 0) t[k].mx[0] = t[k].mi[0] = now;
else t[k].mx[1] = t[k].mi[1] = -now;
return;
}
int mid = (l + r) >> 1;
build(k1, l, mid, tp), build(k2, mid + 1, r, tp);
push_up(k);
}
node query(int k, int ql, int qr) {
int l = t[k].l, r = t[k].r;
if (ql <= l && r <= qr) return t[k];
int mid = (l + r) >> 1;
node now;
up(i, 0, 1) now.mx[i] = -INF, now.mi[i] = INF;
now.ling = 0;
if (ql <= mid) {
node nxt = query(k1, ql, qr);
now.ling = (now.ling | nxt.ling);
up(i, 0, 1) up(i, 0, 1) now.mx[i] = max(now.mx[i], nxt.mx[i]), now.mi[i] = min(now.mi[i], nxt.mi[i]);
}
if (qr > mid) {
node nxt = query(k2, ql, qr);
now.ling = (now.ling | nxt.ling);
up(i, 0, 1) up(i, 0, 1) now.mx[i] = max(now.mx[i], nxt.mx[i]), now.mi[i] = min(now.mi[i], nxt.mi[i]);
}
return now;
}
}T1, T2;
int main() {
// freopen("game.in", "r", stdin);
// freopen("game.out", "w", stdout);
n = read(), m = read(), q = read();
up(i, 1, n) a[i][0] = read();
up(i, 1, m) a[i][1] = read();
T1.build(1, 1, n, 0);
T2.build(1, 1, m, 1);
up(i, 1, q) {
int l1 = read(), r1 = read(), l2 = read(), r2 = read();
node x1 = T1.query(1, l1, r1), x2 = T2.query(1, l2, r2);
// printf("%d %d %d %d %d\n", x1.ling, x1.mx[0], x1.mi[0], x1.mx[1], x1.mi[1]);
// printf("%d %d %d %d %d\n", x2.ling, x2.mx[0], x2.mi[0], x2.mx[1], x2.mi[1]);
ll ans = INFF;
bool zheng1, fu1, ling1, zheng2, fu2, ling2;
zheng1 = (x1.mi[0] != INF), fu1 = (x1.mi[1] != INF), ling1 = x1.ling;
zheng2 = (x2.mi[0] != INF), fu2 = (x2.mi[1] != INF), ling2 = x2.ling;
if (zheng2 && fu2) {
if (ling1) ans = 0;
else ans = max(-(ll)x1.mi[0] * x2.mx[1], -(ll)x1.mi[1] * x2.mx[0]);
}
else if (!fu2) {
if (zheng1 || ling1) {
if (ling2) ans = 0;
else {
if (zheng1) ans = (ll)x1.mx[0] * x2.mi[0];
else ans = 0;
}
}
else ans = -(ll)x1.mi[1] * x2.mx[0];
}
else if (!zheng2) {
if (fu1 || ling1) {
if (ling2) ans = 0;
else {
if (fu1) ans = (ll)x1.mx[1] * x2.mi[1];
else ans = 0;
}
}
else ans = -(ll)x1.mi[0] * x2.mx[1];
}
else if (!zheng2 && !fu2) {
ans = 0;
}
printf("%lld\n", ans);
}
return 0;
}