代码:
#include <bits/stdc++.h>
using namespace std;
int a[100010], b[100010], log_2[100010], cnt1[100010], cnt2[100010], dp[9][100010][20];
int Query_Max(int x, int l, int r)
{
return max(dp[x][l][log_2[r - l + 1]], dp[x][r - (1 << log_2[r - l + 1]) + 1][log_2[r - l + 1]]);
}
int Query_Min(int x, int l, int r)
{
return min(dp[x][l][log_2[r - l + 1]], dp[x][r - (1 << log_2[r - l + 1]) + 1][log_2[r - l + 1]]);
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int n, m, q;
cin >> n >> m >> q;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= m; i++) cin >> b[i];
memset(dp[1], 0xcf, sizeof(dp[1]));
memset(dp[2], 0x3f, sizeof(dp[2]));
memset(dp[3], 0x3f, sizeof(dp[3]));
memset(dp[4], 0xcf, sizeof(dp[4]));
memset(dp[5], 0xcf, sizeof(dp[5]));
memset(dp[6], 0x3f, sizeof(dp[6]));
memset(dp[7], 0xcf, sizeof(dp[7]));
memset(dp[8], 0x3f, sizeof(dp[8]));
for (int i = 1; i <= n; i++)
{
dp[1][i][0] = a[i];
dp[2][i][0] = a[i];
if (a[i] >= 0) dp[3][i][0] = a[i];
if (a[i] <= 0) dp[4][i][0] = a[i];
}
for (int i = 1; i <= m; i++)
{
dp[5][i][0] = b[i];
dp[6][i][0] = b[i];
if (b[i] >= 0) dp[7][i][0] = b[i];
if (b[i] <= 0) dp[8][i][0] = b[i];
}
for (int j = 1; (1 << j) <= n; j++) for (int i = 1; i + (1 << j) - 1 <= n; i++)
{
dp[1][i][j] = max(dp[1][i][j - 1], dp[1][i + (1 << j - 1)][j - 1]);
dp[2][i][j] = min(dp[2][i][j - 1], dp[2][i + (1 << j - 1)][j - 1]);
dp[3][i][j] = min(dp[3][i][j - 1], dp[3][i + (1 << j - 1)][j - 1]);
dp[4][i][j] = max(dp[4][i][j - 1], dp[4][i + (1 << j - 1)][j - 1]);
}
for (int j = 1; (1 << j) <= m; j++) for (int i = 1; i + (1 << j) - 1 <= m; i++)
{
dp[5][i][j] = max(dp[5][i][j - 1], dp[5][i + (1 << j - 1)][j - 1]);
dp[6][i][j] = min(dp[6][i][j - 1], dp[6][i + (1 << j - 1)][j - 1]);
dp[7][i][j] = max(dp[7][i][j - 1], dp[7][i + (1 << j - 1)][j - 1]);
dp[8][i][j] = min(dp[8][i][j - 1], dp[8][i + (1 << j - 1)][j - 1]);
}
for (int i = 2; i <= max(n, m); i++) log_2[i] = log_2[i >> 1] + 1;
for (int i = 1; i <= m; i++)
{
cnt1[i] = cnt1[i - 1];
cnt2[i] = cnt2[i - 1];
if (b[i] >= 0) cnt1[i]++;
if (b[i] <= 0) cnt2[i]++;
}
while (q--)
{
int l1, r1, l2, r2;
cin >> l1 >> r1 >> l2 >> r2;
if (cnt1[r2] - cnt1[l2 - 1] == 0)
{
int x = Query_Min(2, l1, r1);
if (x >= 0)
{
int y = Query_Min(6, l2, r2);
cout << 1ll * x * y << endl;
}
else
{
int y = Query_Max(5, l2, r2);
cout << 1ll * x * y << endl;
}
}
else if (cnt2[r2] - cnt2[l2 - 1] == 0)
{
int x = Query_Max(1, l1, r1);
if (x >= 0)
{
int y = Query_Min(6, l2, r2);
cout << 1ll * x * y << endl;
}
else
{
int y = Query_Max(5, l2, r2);
cout << 1ll * x * y << endl;
}
}
else
{
int x = Query_Min(3, l1, r1), xx = Query_Max(4, l1, r1), y = Query_Min(8, l2, r2), yy = Query_Max(7, l2, r2);
cout << max(1ll * x * y, 1ll * xx * yy) << endl;
}
}
return 0;
}