悬赏关注
#include <iostream>
#include <climits>
using namespace std;
const int N = 1e5 + 10;
typedef long long ll;
const int M = 30;
ll ax[N][M] , an[N][M],af[N][M] , az[N][M],bx[N][M] , bn[N][M];
int l2[N];
ll ma = LONG_LONG_MAX,mi = LONG_LONG_MIN;
inline ll read(){
ll res =0,f = 1;
char c = getchar();
while(!isdigit(c)) {
if(c == '-') f = -1;
c = getchar();
}
while(isdigit(c)){
res = (res << 1) + (res << 3) + c - '0';
c = getchar();
}
return f * res;
}
int main()
{
ll n = read(),m = read(),q = read();
l2[1] = 0;
for(int i = 2;i <= max(n,m);i ++){
l2[i] = l2[i / 2] + 1;
}
for(int i = 1;i <= n;i ++){
ll x = read();
ax[i][0] = x;
an[i][0] = x;
af[i][0] = (x < 0 ? x : mi);
az[i][0] = (x >= 0 ? x : ma);
}
for(int i = 1;i <= m;i ++){
ll x = read();
bx[i][0] = bn[i][0] = x;
}
for(int i = 1;i <= l2[n];i ++){
for(int j = 1;j +(1 << i) - 1 <= n;j ++){
int k = j + (1 << (i - 1));
ax[j][i] = max(ax[j][i - 1],ax[k][i - 1]);
an[j][i] = min(an[j][i - 1],an[k][i - 1]);
af[j][i] = max(af[j][i - 1],af[k][i - 1]);
az[j][i] = min(az[j][i - 1],az[k][i - 1]);
}
}
for(int i = 1;i <= l2[n];i ++){
for(int j = 1;j +(1 << i) - 1 <= n;j ++){
int k = j + (1 << (i - 1));
bx[j][i] = max(bx[j][i - 1],bx[k][i - 1]);
bn[j][i] = min(bn[j][i - 1],bn[k][i - 1]);
}
}
while(q --){
int la = read(),ra = read(),lb = read(),rb = read();
int s1 = l2[ra - la + 1],s2 = l2[rb - lb + 1];
int ka = ra - (1 << s1) + 1,kb = rb - (1 << s2) + 1;
ll amax = max(ax[la][s1],ax[ka][s1]);
ll amin = min(an[la][s1],an[ka][s1]);
ll afmax = max(af[la][s1],af[ka][s1]);
ll azmin = max(az[la][s1],az[ka][s1]);
ll bmax = max(bx[la][s1],bx[ka][s1]);
ll bmin = min(bn[la][s1],bn[ka][s1]);
ll ans = mi;
ans = max(ans,amax * (amax >= 0 ? bmin : bmax));
ans = max(ans,amin * (amin >= 0 ? bmin : bmax));
if(afmax != mi){
ans = max(ans,afmax * (afmax >= 0 ? bmin: bmax));
}
if(azmin != ma){
ans = max(ans,azmin * (azmin >= 0 ? bmin : bmax));
}
printf("%lld\n",ans);
}
return 0;
}