都是特殊性质 2 的。
#include <bits/stdc++.h>
using namespace std;
unsigned q, m, len, l1, r1, l2, r2;
long long xa, pna, nxa, na, xb, pnb, nxb, nb;
bool flaga, flagb;
array<unsigned, 2> n;
array<unsigned, 1000000> Log;
array<array<long long, 1000000>, 2> a;
array<array<array<long long, 25>, 1000000>, 2> ax, an,
apn, anx;
inline long long query_max(
const array<array<long long, 25>, 1000000> &a,
const unsigned &L, const unsigned &R)
{
len = Log[R - L];
return max(a[L][len], a[R - (1u << len)][len]);
}
inline long long query_min(
const array<array<long long, 25>, 1000000> &a,
const unsigned &L, const unsigned &R)
{
len = Log[R - L];
return min(a[L][len], a[R - (1u << len)][len]);
}
int main()
{
//freopen("game.in", "r", stdin);
//freopen("game.out", "w", stdout);
scanf("%u%u%u", &n[0], &n[1], &q);
m = max(++ n[0], ++ n[1]);
for(unsigned i(2u); i != m; ++ i)
Log[i] = Log[i >> 1] + 1u;
for(unsigned k(0u); k != 2u; ++ k)
for(unsigned i(1u); i != n[k]; ++ i)
{
scanf("%lld", &a[k][i]);
ax[k][i][0] = an[k][i][0] = a[k][i];
if(a[k][i] >= 0ll)
apn[k][i][0] = a[k][i];
else
apn[k][i][0] = INT_MAX;
if(a[k][i] <= 0ll)
anx[k][i][0] = a[k][i];
else
anx[k][i][0] = INT_MIN;
}
for(unsigned k(0u); k != 2u; ++ k)
for(unsigned j(1u); j != 25u; ++ j)
for(unsigned i(1u); i + (1u << j) <= n[k]; ++ i)
ax[k][i][j] = max(ax[k][i][j - 1],
ax[k][i + (1u << j - 1u)][j - 1]);
for(unsigned k(0u); k != 2u; ++ k)
for(unsigned j(1u); j != 25u; ++ j)
for(unsigned i(1u); i + (1u << j) <= n[k]; ++ i)
anx[k][i][j] = max(anx[k][i][j - 1],
anx[k][i + (1u << j - 1u)][j - 1]);
for(unsigned k(0u); k != 2u; ++ k)
for(unsigned j(1u); j != 25u; ++ j)
for(unsigned i(1u); i + (1u << j) <= n[k]; ++ i)
an[k][i][j] = min(an[k][i][j - 1],
an[k][i + (1u << j - 1u)][j - 1]);
for(unsigned k(0u); k != 2u; ++ k)
for(unsigned j(1u); j != 25u; ++ j)
for(unsigned i(1u); i + (1u << j) <= n[k]; ++ i)
apn[k][i][j] = min(apn[k][i][j - 1],
apn[k][i + (1u << j - 1u)][j - 1]);
do
{
scanf("%u%u%u%u", &l1, &r1, &l2, &r2);
++ r1;
++ r2;
xa = query_max(ax[0], l1, r1);
pna = query_min(apn[0], l1, r1);
nxa = query_max(anx[0], l1, r1);
na = query_min(an[0], l1, r1);
xb = query_max(ax[1], l2, r2);
pnb = query_min(apn[1], l2, r2);
nxb = query_max(anx[1], l2, r2);
nb = query_min(an[1], l2, r2);
if(xb > 0ll)
{
if(nb < 0ll)
printf("%lld\n", max(pna * nb,
nxa * xb));
else if(xa > 0ll)
printf("%lld\n", xa * nb);
else
printf("%lld\n", xa * xb);
}
else
if(na < 0ll)
printf("%lld\n", na * xb);
else
printf("%lld\n", na * nb);
} while(-- q);
//fclose(stdin);
//fclose(stdout);
return 0;
}