#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
const ll inf=1e18+10;
ll a[N],b[N];
struct tree
{
int l,r;
ll minf,minz,maxf,maxz;
//线段树维护四个值
//minf最小的负数
//minz最小的整数
//maxf最大的负数
//maxz最大的正数
}wa[N*4],wb[N*4];//wa是a数组建的树,wb是b数组建的树
void pushupa(int u)
{
wa[u].maxf=max(wa[u<<1].maxf,wa[u<<1|1].maxf);
wa[u].minf=min(wa[u<<1].minf,wa[u<<1|1].minf);
wa[u].maxz=max(wa[u<<1].maxz,wa[u<<1|1].maxz);
wa[u].minz=min(wa[u<<1].minz,wa[u<<1|1].minz);
}
void builda(int u,int l,int r)
{
wa[u].l=l;
wa[u].r=r;
if(l==r)
{
if(a[l]<0)
{
wa[u].minf=a[l];
wa[u].maxf=a[l];
wa[u].minz=inf;//最小的正数肯定比inf小,因此此区间无贡献
wa[u].maxz=-1;//最大的正数肯定比-1大,因此此区间无贡献
}
else
{
wa[u].minz=a[l];
wa[u].maxz=a[l];
wa[u].minf=1;//最小的负数肯定比1小,因此此区间无贡献
wa[u].maxf=-inf;//最大的负数肯定比-inf小,因此此区间无贡献
}
}
int m=(l+r)>>1;
builda(u<<1,l,m);
builda(u<<1|1,m+1,r);
pushupa(u);
}
ll queryminfa(int u,int l,int r)
{
if(l<=wa[u].l&&wa[u].r<=r)
return wa[u].minf;
else if(wa[u].l>r||wa[u].r<l)
return 1;
else
return min(queryminfa(u<<1,l,r),queryminfa(u<<1|1,l,r));
}
ll queryminza(int u,int l,int r)
{
if(l<=wa[u].l&&wa[u].r<=r)
return wa[u].minz;
else if(wa[u].l>r||wa[u].r<l)
return inf;
else
return min(queryminza(u<<1,l,r),queryminza(u<<1|1,l,r));
}
ll querymaxza(int u,int l,int r)
{
if(l<=wa[u].l&&wa[u].r<=r)
return wa[u].maxz;
else if(wa[u].l>r||wa[u].r<l)
return -1;
else
return max(querymaxza(u<<1,l,r),querymaxza(u<<1|1,l,r));
}
ll querymaxfa(int u,int l,int r)
{
if(l<=wa[u].l&&wa[u].r<=r)
return wa[u].maxf;
else if(wa[u].l>r||wa[u].r<l)
return -inf;
else
return max(querymaxfa(u<<1,l,r),querymaxfa(u<<1|1,l,r));
}
void pushupb(int u)
{
wb[u].maxf=max(wb[u<<1].maxf,wb[u<<1|1].maxf);
wb[u].minf=min(wb[u<<1].minf,wb[u<<1|1].minf);
wb[u].maxz=max(wb[u<<1].maxz,wb[u<<1|1].maxz);
wb[u].minz=min(wb[u<<1].minz,wb[u<<1|1].minz);
}
void buildb(int u,int l,int r)
{
wb[u].l=l;
wb[u].r=r;
if(l==r)
{
if(b[l]<0)
{
wb[u].minf=b[l];
wb[u].maxf=b[l];
wb[u].minz=inf;
wb[u].maxz=-1;
}
else
{
wb[u].minz=b[l];
wb[u].maxz=b[l];
wb[u].minf=1;
wb[u].maxf=-inf;
}
}
int m=(l+r)>>1;
buildb(u<<1,l,m);
buildb(u<<1|1,m+1,r);
pushupb(u);
}
ll queryminfb(int u,int l,int r)
{
if(l<=wb[u].l&&wb[u].r<=r)
return wb[u].minf;
else if(wb[u].l>r||wb[u].r<l)
return 1;
else
return min(queryminfb(u<<1,l,r),queryminfb(u<<1|1,l,r));
}
ll queryminzb(int u,int l,int r)
{
if(l<=wb[u].l&&wb[u].r<=r)
return wb[u].minz;
else if(wb[u].l>r||wb[u].r<l)
return inf;
else
return min(queryminzb(u<<1,l,r),queryminzb(u<<1|1,l,r));
}
ll querymaxzb(int u,int l,int r)
{
if(l<=wb[u].l&&wb[u].r<=r)
return wb[u].maxz;
else if(wb[u].l>r||wb[u].r<l)
return -1;
else
return max(querymaxzb(u<<1,l,r),querymaxzb(u<<1|1,l,r));
}
ll querymaxfb(int u,int l,int r)
{
if(l<=wb[u].l&&wb[u].r<=r)
return wb[u].maxf;
else if(wb[u].l>r||wb[u].r<l)
return -inf;
else
return max(querymaxfb(u<<1,l,r),querymaxfb(u<<1|1,l,r));
}
ll ans(int l1,int r1,int l2,int r2)
{
ll finalans=-inf;
bool situ1=1;
ll ans1;
ll a1=querymaxza(1,l1,r1);
ll b1=queryminzb(1,l2,r2);
if(a1==-1||b1==inf) situ1=0;
if(situ1) ans1=a1*b1;
bool situ2=1;
ll ans2;
ll a2=queryminza(1,l1,r1);
ll b2=queryminfb(1,l2,r2);
if(a2==inf||b2==1) situ2=0;
if(situ2) ans2=a2*b2;
bool situ3=1;
ll ans3;
ll a3=querymaxfa(1,l1,r1);
ll b3=querymaxzb(1,l2,r2);
if(a3==-inf||b3==-1) situ3=0;
if(situ3) ans3=a3*b3;
bool situ4=1;
ll ans4;
ll a4=queryminfa(1,l1,r1);
ll b4=querymaxfb(1,l2,r2);
if(a4==1||b4==-inf) situ4=0;
if(situ4) ans4=a4*b4;
if(situ1) finalans=max(finalans,ans1);
if(situ2) finalans=max(finalans,ans2);
if(situ3) finalans=max(finalans,ans3);
if(situ4) finalans=max(finalans,ans4);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m,q;
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=m;i++)
cin>>b[i];
builda(1,1,n);
buildb(1,1,m);
cout<<wa[1].maxf;
for(int i=1;i<=q;i++)
{
int l1,r1,l2,r2;
cout<<ans(l1,r1,l2,r2)<<"\n";
}
}