大样例 game3.in 挂了,game4.in 还没测。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int f1max[20][N], f1min[20][N], f2max[20][N], f2min[20][N];
bool f1_0[20][N], f2_0[20][N];
LL f1maxn[20][N], f1minp[20][N];
int a[N], b[N];
int lg2[N];
void init_lg2()
{
int cnt = 0;
for(int i = 1; i < N; i <<= 1)
lg2[i] = cnt ++;
for(int i = 3; i <= N - 10; i ++)
if(!lg2[i]) lg2[i] = lg2[i - 1];
}
LL query(int l1, int r1, int l2, int r2)
{
LL ans = 0;
int e = lg2[r1 - l1 + 1], f = lg2[r2 - l2 + 1];
bool p1, z1, n1, p2, z2, n2; //p=positive, z=zero, n=negative
LL f1x = max(f1max[e][l1], f1max[e][r1 - (1 << e) + 1]);
LL f2x = max(f2max[f][l2], f2max[f][r2 - (1 << f) + 1]);
LL f1n = min(f1min[e][l1], f1min[e][r1 - (1 << e) + 1]);
LL f2n = min(f2min[f][l2], f2min[f][r2 - (1 << f) + 1]);
LL f1np = min(f1minp[e][l1], f1minp[e][r1 - (1 << e) + 1]);
LL f1xn = max(f1maxn[e][l1], f1maxn[e][r1 - (1 << e) + 1]);
//x = maximum, n = minimum
p1 = f1x > 0;
z1 = f1_0[e][l1] | f1_0[e][r1 - (1 << e) + 1];
n1 = f1n < 0;
p2 = f2x > 0;
z2 = f2_0[f][l2] | f2_0[f][r2 - (1 << f) + 1];
n2 = f2n < 0;
if(p2 && !z2 && !n2)
{
if(p1) ans = (LL)(f1x * f2n);
else ans = (LL)(f1x * f2x);
// cout << "1" << endl;
}
else if(!p2 && z2 && !n2) ans = 0ll;
else if(!p2 && !z2 && n2)
{
if(n1) ans = (LL)f1n * f2x;
else ans = (LL)f1n * f2n;
// puts("2");
}
else if(p2 && z2 && !n2)
{
if(p1 || z1) ans = 0ll;
else ans = (LL)f1x * f2x;
// cout << "3" << endl;
}
else if(p2 && n2)
{
int sta1 = (LL)p1, sta2 = (LL)n1;
if(z1) ans = 0ll;
else ans = max(sta1 * (LL)(f1np * f2n), sta2 * (LL)(f1xn * f2x));
// cout << "4" << endl;
}
else if(!p2 && z2 && n2)
{
if(z1 || n1) ans = 0ll;
else ans = (LL)f1n * f2n;
// puts("5");
}
return ans;
}
int main()
{
// freopen("game3.in", "r", stdin);
// memset(f1max, -0x3f, sizeof f1max);
// memset(f2max, -0x3f, sizeof f2max);
// memset(f1min, 0x3f, sizeof f1min);
// memset(f2min, 0x3f, sizeof f2min);
// memset(f1maxn, -0x3f, sizeof f1maxn);
// memset(f1minp, 0x3f, sizeof f1minp);
int n, m, q;
cin >> n >> m >> q;
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
for(int i = 1; i <= m; i ++) scanf("%d", &b[i]);
init_lg2();
int lgn = lg2[n];
int lgm = lg2[m];
for(int i = 1; i <= n; i ++){
f1max[0][i] = a[i];
f1min[0][i] = a[i];
f1_0[0][i] = a[i] == 0;
f1maxn[0][i] = a[i] < 0 ? a[i] : -1e18;
f1minp[0][i] = a[i] > 0 ? a[i] : 1e18;
}
for(int i = 1; i <= lgn; i ++)
for(int j = 1; j + (1 << i) - 1 <= n; j ++)
{
f1max[i][j] = max(f1max[i - 1][j], f1max[i - 1][j + (1 << i - 1)]);
f1min[i][j] = min(f1min[i - 1][j], f1min[i - 1][j + (1 << i - 1)]);
f1_0[i][j] = f1_0[i - 1][j] | f1_0[i - 1][j + (1 << i - 1)];
f1maxn[i][j] = max(f1maxn[i - 1][j], f1maxn[i - 1][j + (1 << i - 1)]);
f1minp[i][j] = min(f1minp[i - 1][j], f1minp[i - 1][j + (1 << i - 1)]);
}
for(int i = 1; i <= m; i ++)
{
f2max[0][i] = b[i];
f2min[0][i] = b[i];
f2_0[0][i] = b[i] == 0;
}
for(int i = 1; i <= lgm; i ++)
for(int j = 1; j + (1 << i) - 1 <= m; j ++)
{
f2max[i][j] = max(f2max[i - 1][j], f2max[i - 1][j + (1 << i - 1)]);
f2min[i][j] = min(f2min[i - 1][j], f2min[i - 1][j + (1 << i - 1)]);
f2_0[i][j] = f2_0[i - 1][j] | f2_0[i - 1][j + (1 << i - 1)];
}
int l1, l2, r1, r2;
while(q --)
{
scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
printf("%lld\n", query(l1, r1, l2, r2));
}
return 0;
}