代码
#include<bits/stdc++.h>
using namespace std;
int n, m, q, a[100005], b[100005];
int amax[100005][20], amin[100005][20], zamin[100005][20], famax[100005][20];
int bmax[100005][20], bmin[100005][20];
int log(int s)
{
int t = 0;
while(s != 1)
{
s >>= 1;
t++;
}
return t;
}
int 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];
for(int i = 1; i <= n; i++)amax[i][0] = a[i];
for(int i = 1; i <= log(n); i++)
{
for(int j = 1; j + (1 << i) - 1 <= n; j++)
{
amax[j][i] = max(amax[j][i - 1], amax[j + (1 << (i - 1))][i - 1]);
}
}
for(int i = 1; i <= n; i++)amin[i][0] = a[i];
for(int i = 1; i <= log(n); i++)
{
for(int j = 1; j + (1 << i) - 1 <= n; j++)
{
amin[j][i] = min(amin[j][i - 1], amin[j + (1 << (i - 1))][i - 1]);
}
}
for(int i = 1; i <= m; i++)bmax[i][0] = b[i];
for(int i = 1; i <= log(m); i++)
{
for(int j = 1; j + (1 << i) - 1 <= m; j++)
{
bmax[j][i] = max(bmax[j][i - 1], bmax[j + (1 << (i - 1))][i - 1]);
}
}
for(int i = 1; i <= m; i++)bmin[i][0] = b[i];
for(int i = 1; i <= log(m); i++)
{
for(int j = 1; j + (1 << i) - 1 <= m; j++)
{
bmin[j][i] = min(bmin[j][i - 1], bmin[j + (1 << (i - 1))][i - 1]);
}
}
for(int i = 1; i <= n; i++)zamin[i][0] = (a[i] >= 0 ? a[i] : 0x7fffffff);
for(int i = 1; i <= log(n); i++)
{
for(int j = 1; j + (1 << i) - 1 <= n; j++)
{
zamin[j][i] = min(zamin[j][i - 1], zamin[j + (1 << (i - 1))][i - 1]);
}
}
for(int i = 1; i <= n; i++)famax[i][0] = (a[i] <= 0 ? a[i] : -0x7fffffff);
for(int i = 1; i <= log(n); i++)
{
for(int j = 1; j + (1 << i) - 1 <= n; j++)
{
famax[j][i] = max(famax[j][i - 1], famax[j + (1 << (i - 1))][i - 1]);
}
}
int l1, r1, l2, r2;
while(q--)
{
cin >> l1 >> r1 >> l2 >> r2;
int t1 = log(r1 - l1 + 1), t2 = log(r2 - l2 + 1);
long long ans = max(max(amax[l1][t1], amax[r1 - (1 << t1) + 1][t1]) * min(bmin[l2][t2], bmin[r2 - (1 << t2) + 1][t2]), min(amin[l1][t1], amin[r1 - (1 << t1) + 1][t1]) * max(bmax[l2][t2], bmax[r2 - (1 << t2) + 1][t2]));
if(min(zamin[l1][t1], zamin[r1 - (1 << t1) + 1][t1]) != -0x7fffffff)
ans = max(ans, (long long)min(zamin[l1][t1], zamin[r1 - (1 << t1) + 1][t1]) * min(bmin[l2][t2], bmin[r2 - (1 << t2) + 1][t2]));
if(max(famax[l1][t1], famax[r1 - (1 << t1) + 1][t1]) != 0x7fffffff)
ans = max(ans, (long long)max(famax[l1][t1], famax[r1 - (1 << t1) + 1][t1]) * max(bmax[l2][t2], bmax[r2 - (1 << t2) + 1][t2]));
cout << ans << '\n';
}
}
样例1,2可过 评测0pts,为什么?