rt,有性质1的点都对了,其他全错。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, m, q;
int a[100005], b[100005], mxa[100005][30], mna[100005][30], mxb[100005][30], mnb[100005][30];
int mxna[100005][30], mnpa[100005][30];//mxna最大负数, mnpa最小非负数
void init()
{
int inf =LONG_LONG_MAX;
for(int i = 1; i <= n; i++)
{
mxa[i][0] = a[i];
mna[i][0] = a[i];
if(a[i] < 0)mxna[i][0] = a[i];
else mxna[i][0] = -inf;
if(a[i] >= 0)mnpa[i][0] = a[i];
else mnpa[i][0] = inf;
}
for(int i = 1; i <= m; i++)
{
mxb[i][0] = b[i];
mnb[i][0] = b[i];
}
for(int j = 1; (1 << j) <= n; j++)
{
for(int i = 1; i + (1 << j) - 1 <= n; i++)
{
mxa[i][j] = max(mxa[i][j - 1], mxa[i + (1 << (j - 1))][j - 1]);
mna[i][j] = min(mna[i][j - 1], mna[i + (1 << (j - 1))][j - 1]);
mxna[i][j] = max(mxna[i][j - 1], mxna[i][j]);
mxna[i][j] = max(mxna[i + (1 << (j - 1))][j - 1], mxna[i][j]);
mnpa[i][j] = min(mnpa[i][j - 1], mnpa[i][j]);
mnpa[i][j] = min(mnpa[i + (1 << (j - 1))][j - 1], mnpa[i][j]);
}
}
for(int j = 1; (1 << j) <= m; j++)
{
for(int i = 1; i + (1 << j) - 1 <= m; i++)
{
mxb[i][j] = max(mxb[i][j - 1], mxb[i + (1 << (j - 1))][j - 1]);
mnb[i][j] = min(mnb[i][j - 1], mnb[i + (1 << (j - 1))][j - 1]);
}
}
}
void query(int l1, int r1, int l2, int r2)
{
int k1 = log2(r1 - l1 + 1), k2 = log2(r2 - l2 + 1);
int x, y, sum = -1e9, ans = -1e9;
// 1 : x < 0, y = max{}
y = max(mxb[l2][k2], mxb[r2 - (1 << k2) + 1][k2]);
if(y >= 0)x = max(mxna[l1][k1], mxna[r1 - (1 << k1) + 1][k1]), sum = max(sum, x * y);
else x = min(mna[l1][k1], mna[r1 - (1 << k1) + 1][k1]), sum = max(sum, x * y);
//cout << x << " " << y << " " << sum << endl;
if(x < 0)ans = max(ans, sum);
sum = -1e9;
// 2 : x >= 0, y = min{}
y = min(mnb[l2][k2], mnb[r2 - (1 << k2) + 1][k2]);
if(y >= 0)x = max(mxa[l1][k1], mxa[r1 - (1 << k1) + 1][k1]), sum = max(sum, x * y);
else x = min(mnpa[l1][k1], mnpa[r1 - (1 << k1) + 1][k1]), sum = max(sum, x * y);
if(x >= 0)ans = max(ans, sum);
cout << ans << endl;
}
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];
}
init();
for(int i = 1; i <= q; i++)
{
int l1, r1, l2, r2;
cin >> l1 >> r1 >> l2 >> r2;
query(l1, r1, l2, r2);
}
return 0;
}