评测记录
#include <bits/stdc++.h>
#define int long long
#define ls (p << 1)
#define rs (p << 1 | 1)
#define mid ((l + r) >> 1)
#define INF 1e18
using namespace std;
int n,m,q,a[100005],b[100005];
struct JP8 {
int mx;
int mn;
int mnz;
int mxf;
} ta[1000006],tb[1000006];
void pushup (int p) {
ta[p].mx = max(ta[ls].mx,ta[rs].mx);
ta[p].mn = min(ta[ls].mn,ta[rs].mn);
ta[p].mnz = min(ta[ls].mnz,ta[rs].mnz);
ta[p].mxf = max(ta[ls].mxf,ta[rs].mxf);
tb[p].mx = max(tb[ls].mx,tb[rs].mx);
tb[p].mn = min(tb[ls].mn,tb[rs].mn);
}
void build (int p,int l,int r) {
ta[p].mx = -INF;
ta[p].mn = INF;
ta[p].mnz = INF;
ta[p].mxf = -INF;
tb[p].mx = -INF;
tb[p].mn = INF;
if (l == r) {
if (l <= n) {
ta[p].mx = a[l];
ta[p].mn = a[l];
if (a[l] >= 0) {
ta[p].mnz = a[l];
}
if (a[l] <= 0) {
ta[p].mxf = a[l];
}
}
if (l <= m) {
tb[p].mx = b[l];
tb[p].mn = b[l];
if (b[l] >= 0) {
tb[p].mnz = b[l];
}
if (b[l] <= 0) {
tb[p].mxf = b[l];
}
}
return;
}
build(ls,l,mid);
build(rs,mid + 1,r);
pushup(p);
return;
}
JP8 query (int p,int l,int r,int ql,int qr,char c) {
if (ql <= l && r <= qr) {
if (c == 'a') {
return ta[p];
} else {
return tb[p];
}
}
JP8 ret,que;
ret.mx = -INF;
ret.mn = INF;
ret.mnz = INF;
ret.mxf = -INF;
if (ql <= mid) {
que = query(ls,l,mid,ql,qr,c);
ret.mx = max(ret.mx,que.mx);
ret.mn = min(ret.mn,que.mn);
ret.mnz = min(ret.mnz,que.mnz);
ret.mxf = max(ret.mxf,que.mxf);
}
if (qr > mid) {
que = query(rs,mid + 1,r,ql,qr,c);
ret.mx = max(ret.mx,que.mx);
ret.mn = min(ret.mn,que.mn);
ret.mnz = min(ret.mnz,que.mnz);
ret.mxf = max(ret.mxf,que.mxf);
}
return ret;
}
signed main () {
cin >> n >> m >> q;
for (int i = 1;i <= n;i++) {
cin >> a[i];
}
for (int i = 1;i <= m;i++) {
cin >> b[i];
}
build(1,1,max(n,m));
while (q--) {
int l1,r1,l2,r2;
cin >> l1 >> r1 >> l2 >> r2;
JP8 A = query(1,1,n,l1,r1,'a'),B = query(1,1,n,l2,r2,'b');
int ans = -INF * INF;
if (A.mx < 0) {
if (B.mx < 0) {
ans = A.mn * B.mx;
} else {
ans = A.mx * B.mx;
}
} else if (A.mn >= 0) {
if (B.mn >= 0) {
ans = A.mx * B.mn;
} else {
ans = A.mn * B.mn;
}
} else {
if (B.mx < 0) {
ans = A.mn * B.mx;
} else if (B.mn >= 0) {
ans = A.mx * B.mn;
} else {
if (A.mnz < INF) {
ans = max(ans,A.mnz * B.mn);
}
if (A.mxf > -INF) {
ans = max(ans,A.mxf * B.mx);
}
}
}
cout << ans << endl;
}
return 0;
}