怎么优化啊
#include<iostream>
#include<cstdio>
using namespace std;
long long m,n,q,a[100008],b[100008],stamax[100008][55],stamin[100008][55],stbmax[100008][55],stbmin[100008][55],log[100008];
inline long long read()
{
long long x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main(){
n=read();
m=read();
q=read();
for(int i=1;i<=n;i++){
a[i]=read();
stamax[i][0]=a[i];
stamin[i][0]=a[i];
}
for(int i=1;i<=m;i++){
b[i]=read();
stbmax[i][0]=b[i];
stbmin[i][0]=b[i];
}
log[1]=0;log[2]=1;
for(register int i=3;i<=max(n,m);i++){
log[i]=log[(i>>1)]+1;
}
for(register int j=1;j<=log[n];j++){
for(register int i=1;i<=n-(1<<j)+1;i++){
stamax[i][j]=max(stamax[i][j-1],stamax[i+(1<<(j-1))][j-1]);
stamin[i][j]=min(stamin[i][j-1],stamin[i+(1<<(j-1))][j-1]);
}
}
for(register int j=1;j<=log[m];j++){
for(register int i=1;i<=m-(1<<j)+1;i++){
stbmax[i][j]=max(stbmax[i][j-1],stbmax[i+(1<<(j-1))][j-1]);
stbmin[i][j]=min(stbmin[i][j-1],stbmin[i+(1<<(j-1))][j-1]);
}
}
long long l1,l2,r1,r2;
while(q--){
long long cmp1,cmp2;
long long azhenmin=999999999;long long afumax=-999999999;
l1=read();r1=read();l2=read();r2=read();
for(int i=l1;i<=r1;i++){
if(a[i]>afumax&&a[i]<0){
afumax=a[i];
}
if(a[i]<azhenmin&&a[i]>=0){
azhenmin=a[i];
}
}
long long int kl=log[r2-l2+1];
long long int bmax=max(stbmax[l2][kl],stbmax[r2-(1<<kl)+1][kl]);
long long int bmin=min(stbmin[l2][kl],stbmin[r2-(1<<kl)+1][kl]);
kl=log[r1-l1+1];
long long int amax=max(stamax[l1][kl],stamax[r1-(1<<kl)+1][kl]);
long long int amin=min(stamin[l1][kl],stamin[r1-(1<<kl)+1][kl]);
if(bmin>=0){
cmp1=bmin*amax;
}
if(bmin<0){
cmp1=azhenmin*bmin;
}
if(bmax>=0){
cmp2=afumax*bmax;
}
if(bmax<0){
cmp2=amin*bmax;
}
int l;
if(amin>=0){
cout<<cmp1<<endl;
}
else if(amax<0){
cout<<cmp2<<endl;
}
else{
cout<<max(cmp1,cmp2)<<endl;
}
}
return 0;
}