#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
int n, m, q;
const int maxn = 1e5 + 1;
#define mid (r + l) / 2
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
struct kk {
int pmax, maxx, minn, nmin;
};
struct node {
kk tree[maxn * 4 + 1], tag[maxn * 4 + 1];
void inin(int x) {
for(int i = 1; i <= maxn * 4; i++) {
tree[i].maxx = tag[i].maxx = -1e18;
tree[i].minn = tag[i].minn = 1e18;
tree[i].nmin = tag[i].nmin = 1e18;
tree[i].pmax = tag[i].pmax = -1e18;
}
}
void pushdown(int rt, int l, int r) {
tree[rt].maxx = max(tree[rt].maxx, tag[rt].maxx);
tag[rt << 1].maxx = max(tag[rt].maxx, tag[rt << 1].maxx);
tag[rt << 1 | 1].maxx = max(tag[rt].maxx, tag[rt << 1 | 1].maxx);
tag[rt].maxx = -1e18;
tree[rt].minn = min(tree[rt].minn, tag[rt].minn);
tag[rt << 1].minn = min(tag[rt].minn, tag[rt << 1].minn);
tag[rt << 1 | 1].minn = min(tag[rt].minn, tag[rt << 1 | 1].minn);
tag[rt].minn = 1e18;
if(tag[rt].pmax < 0) {
tree[rt].pmax= max(tree[rt].pmax, tag[rt].pmax);
tag[rt << 1].pmax = max(tag[rt].pmax, tag[rt << 1].pmax);
tag[rt << 1 | 1].pmax = max(tag[rt].pmax, tag[rt << 1 | 1].pmax);
}
tag[rt].maxx = -1e18;
if(tag[rt].nmin > 0) {
tag[rt << 1].nmin = min(tag[rt].nmin, tag[rt << 1].nmin);
tag[rt << 1 | 1].nmin = min(tag[rt].nmin, tag[rt << 1 | 1].nmin);
}
tag[rt].nmin = 1e18;
return ;
}
void pushup(int rt, int l, int r) {
pushdown(rt, l, r);
pushdown(lson);
pushdown(rson);
tree[rt].maxx = max(tree[rt << 1].maxx, tree[rt << 1 | 1].maxx);
tree[rt].minn = min(tree[rt << 1].minn, tree[rt << 1 | 1].minn);
tree[rt].nmin = min(tree[rt << 1].nmin, tree[rt << 1 | 1].nmin);
tree[rt].pmax = max(tree[rt << 1].pmax, tree[rt << 1 | 1].pmax);
return;
}
void pp(int rt, int val) {
tag[rt].maxx = max(tag[rt].maxx, val);
tag[rt].minn = min(tag[rt].minn, val);
if(val >= 0)
tag[rt].nmin = min(tag[rt].nmin, val);
if(val < 0)
tag[rt].pmax = max(tag[rt].pmax, val);
}
void update(int rt, int l, int r, int L, int R, int val) {
if(L <= l && r <= R) {
pp(rt, val);
return
;
}
pushdown(rt, l, r);
if(mid >= L) update(lson, L, R, val);
if(mid < R) update(rson, L, R, val);
pushup(rt, l, r);
return ;
}
kk p2(kk a, kk b) {
a.maxx = max(a.maxx, b.maxx);
a.minn = min(a.minn, b.minn);
a.nmin = min(a.nmin, b.nmin);
a.pmax = max(a.pmax, b.pmax);
}
kk query(int rt, int l, int r, int L, int R) {
if(L <= l && r <= R) {
return tree[rt];
}
pushdown(rt, l, r);
kk ans;
if(mid >= L) ans = p2(ans, query(lson, L, R) );
if(mid < R) ans = p2(ans, query(rson, L, R) );
return ans;
}
} a, b;
signed main() {
cin >> n >> m >> q;
a.inin(n);
b.inin(m);
for(int i = 1; i <= n; i++) {
int val;
cin >> val;
a.update(1, 1, n, i, i, val);
}
for(int i = 1; i <= m; i++) {
int val;
cin >> val;
b.update(1 , 1, m, i, i, val);
}
for(int i = 1; i <= q; i++) {
int l, r;
cin >> l >> r;
kk aans = a.query(1, 1, n, l, r);
cin >> l >> r;
kk bans = b.query(1, 1, m, l, r);
cout << aans.maxx << ' ' << aans.minn << ' ' << aans.nmin << ' ' << aans.pmax << '\n';
int ans = -1e18;
ans = max(ans, aans.maxx * bans.minn);
ans = max(ans, aans.minn * bans.maxx);
if(aans.nmin >= 0) {
ans = max(ans, aans.nmin * bans.minn);
} else {
ans = max(ans, aans.pmax * bans.maxx);
}
cout << ans << '\n';
}
return 0;
}