#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 0x3f3f3f3f3f3f3f3f; // 修正1:扩大INF范围
#define rep(i,s,t) for(register ll i = s;i <= t;++i)
#define per(i,t,s) for(register ll i = t;i >= s;--i)
const ll N = 1e5 + 5;
const ll M = 5e5 + 5; // 4*n满足1e5数据
ll n, m, q, a[N], b[N];
class segment_tree {
private:
struct node {
ll l, r, maxn, minn;
} t[M];
inline ll lson(ll p) { return p << 1; }
inline ll rson(ll p) { return p << 1 | 1; }
inline void push_up(ll p) {
t[p].maxn = max(t[lson(p)].maxn, t[rson(p)].maxn);
t[p].minn = min(t[lson(p)].minn, t[rson(p)].minn);
}
public:
void build(ll p, ll l, ll r) {
t[p].l = l; t[p].r = r;
if(l == r) {
t[p].maxn = t[p].minn = 0; // B树初始0
return;
}
ll mid = (l + r) >> 1;
build(lson(p), l, mid);
build(rson(p), mid+1, r);
push_up(p);
}
void update(ll p, ll x, ll k) {
if(t[p].l == t[p].r) {
t[p].maxn = t[p].minn = k;
return;
}
ll mid = (t[p].l + t[p].r) >> 1;
if(x <= mid) update(lson(p), x, k);
else update(rson(p), x, k);
push_up(p);
}
ll query_max(ll p, ll l, ll r) {
if(l <= t[p].l && t[p].r <= r) return t[p].maxn;
ll mid = (t[p].l + t[p].r) >> 1;
ll ans = -INF;
if(l <= mid) ans = max(ans, query_max(lson(p), l, r));
if(r > mid) ans = max(ans, query_max(rson(p), l, r));
return ans;
}
ll query_min(ll p, ll l, ll r) {
if(l <= t[p].l && t[p].r <= r) return t[p].minn;
ll mid = (t[p].l + t[p].r) >> 1;
ll ans = INF;
if(l <= mid) ans = min(ans, query_min(lson(p), l, r));
if(r > mid) ans = min(ans, query_min(rson(p), l, r));
return ans;
}
};
class dual_segment_tree {
private:
struct node {
ll l, r, maxn, minn;
} t[M];
inline ll lson(ll p) { return p << 1; }
inline ll rson(ll p) { return p << 1 | 1; }
inline void push_up(ll p) {
t[p].maxn = max(t[lson(p)].maxn, t[rson(p)].maxn);
t[p].minn = min(t[lson(p)].minn, t[rson(p)].minn);
}
public:
void build(ll p, ll l, ll r) {
t[p].l = l; t[p].r = r;
if(l == r) {
// 修正2:叶子节点初始化为无效值
t[p].maxn = -INF;
t[p].minn = INF;
return;
}
ll mid = (l + r) >> 1;
build(lson(p), l, mid);
build(rson(p), mid+1, r);
push_up(p);
}
void update(ll p, ll x, ll k, bool opt) {
if(t[p].l == t[p].r) {
if(opt) { // 设置为无效值
t[p].maxn = -INF;
t[p].minn = INF;
} else { // 正常更新
t[p].maxn = t[p].minn = k;
}
return;
}
ll mid = (t[p].l + t[p].r) >> 1;
if(x <= mid) update(lson(p), x, k, opt);
else update(rson(p), x, k, opt);
push_up(p);
}
ll query_max(ll p, ll l, ll r) {
if(l <= t[p].l && t[p].r <= r) return t[p].maxn;
ll mid = (t[p].l + t[p].r) >> 1;
ll ans = -INF;
if(l <= mid) ans = max(ans, query_max(lson(p), l, r));
if(r > mid) ans = max(ans, query_max(rson(p), l, r));
return ans;
}
ll query_min(ll p, ll l, ll r) {
if(l <= t[p].l && t[p].r <= r) return t[p].minn;
ll mid = (t[p].l + t[p].r) >> 1;
ll ans = INF;
if(l <= mid) ans = min(ans, query_min(lson(p), l, r));
if(r > mid) ans = min(ans, query_min(rson(p), l, r));
return ans;
}
};
segment_tree t;
dual_segment_tree pos, neg;
inline ll read() {
ll x = 0, y = 1; char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') y = -y;
c = getchar();
}
while(c >= '0' && c <= '9') {
x = (x << 3) + (x << 1) + (c ^ '0');
c = getchar();
}
return x * y;
}
inline void write(ll x) {
if(x < 0) { putchar('-'); write(-x); return; }
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
}
int main() {
n = read(); m = read(); q = read();
pos.build(1, 1, n);
neg.build(1, 1, n);
rep(i, 1, n) {
a[i] = read();
if(a[i] >= 0) {
pos.update(1, i, a[i], false);
neg.update(1, i, a[i], true); // 负数树设为无效
} else {
pos.update(1, i, a[i], true); // 非负树设为无效
neg.update(1, i, a[i], false);
}
}
t.build(1, 1, m);
rep(i, 1, m) {
b[i] = read();
t.update(1, i, b[i]);
}
while(q--) {
ll l1 = read(), r1 = read(), l2 = read(), r2 = read();
ll maxb = t.query_max(1, l2, r2);
ll minb = t.query_min(1, l2, r2);
ll max_pos = pos.query_max(1, l1, r1);
ll min_pos = pos.query_min(1, l1, r1);
ll max_neg = neg.query_max(1, l1, r1);
ll min_neg = neg.query_min(1, l1, r1);
ll ans = -INF;
if(max_pos != -INF) ans = max(ans, max_pos * minb);
if(min_pos != INF) ans = max(ans, min_pos * minb);
if(max_neg != -INF) ans = max(ans, max_neg * maxb);
if(min_neg != INF) ans = max(ans, min_neg * maxb);
write(ans); putchar('\n');
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f3f3f3f3f
#define rep(i,s,t) for(register ll i = s;i <= t;++i)
#define per(i,t,s) for(register ll i = t;i >= s;--i)
const ll N = 1e5 + 5;
const ll M = 5e5 + 5;
ll n;
ll m;
ll q;
ll ans = -INF;
ll a[N] = {};
ll b[N] = {};
class segment_tree
{
private:
struct node
{
ll l;
ll r;
ll maxn;
ll minn;
};
node t[M];
inline ll lson(ll p)
{
return p << 1;
}
inline ll rson(ll p)
{
return p << 1 | 1;
}
inline void push_up(ll p)
{
t[p].maxn = max(t[lson(p)].maxn,t[rson(p)].maxn);
t[p].minn = min(t[lson(p)].minn,t[rson(p)].minn);
}
public:
inline void build(ll p,ll l,ll r)
{
t[p].l = l;
t[p].r = r;
if(l == r)
{
t[p].maxn = 0;
t[p].minn = 0;
return;
}
ll mid = l + r >> 1;
build(lson(p),l,mid);
build(rson(p),mid + 1,r);
push_up(p);
}
inline void update(ll p,ll x,ll k)
{
if(t[p].l == t[p].r)
{
t[p].maxn = k;
t[p].minn = k;
return;
}
ll mid = t[p].l + t[p].r >> 1;
if(x <= mid)
update(lson(p),x,k);
else
update(rson(p),x,k);
push_up(p);
}
inline ll query_max(ll p,ll l,ll r)
{
if(l <= t[p].l && t[p].r <= r)
return t[p].maxn;
ll ans = -INF;
ll mid = t[p].l + t[p].r >> 1;
if(l <= mid)
ans = max(ans,query_max(lson(p),l,r));
if(r > mid)
ans = max(ans,query_max(rson(p),l,r));
return ans;
}
inline ll query_min(ll p,ll l,ll r)
{
if(l <= t[p].l && t[p].r <= r)
return t[p].minn;
ll ans = INF;
ll mid = t[p].l + t[p].r >> 1;
if(l <= mid)
ans = min(ans,query_min(lson(p),l,r));
if(r > mid)
ans = min(ans,query_min(rson(p),l,r));
return ans;
}
};
class dual_segment_tree
{
private:
struct node
{
ll l;
ll r;
ll maxn;
ll minn;
};
node t[M];
inline ll lson(ll p)
{
return p << 1;
}
inline ll rson(ll p)
{
return p << 1 | 1;
}
inline void push_up(ll p)
{
t[p].maxn = max(t[lson(p)].maxn,t[rson(p)].maxn);
t[p].minn = min(t[lson(p)].minn,t[rson(p)].minn);
}
public:
inline void build(ll p,ll l,ll r)
{
t[p].l = l;
t[p].r = r;
t[p].maxn = -INF;
t[p].minn = INF;
if(l == r)
return;
ll mid = l + r >> 1;
build(lson(p),l,mid);
build(rson(p),mid + 1,r);
push_up(p);
}
inline void update(ll p,ll x,ll k,bool opt)
{
if(t[p].l == t[p].r)
{
if(opt)
{
t[p].maxn = -INF;
t[p].minn = INF;
}
else
{
t[p].maxn = k;
t[p].minn = k;
}
return;
}
ll mid = t[p].l + t[p].r >> 1;
if(x <= mid)
update(lson(p),x,k,opt);
else
update(rson(p),x,k,opt);
push_up(p);
}
inline ll query_max(ll p,ll l,ll r)
{
if(l <= t[p].l && t[p].r <= r)
return t[p].maxn;
ll ans = -INF;
ll mid = t[p].l + t[p].r >> 1;
if(l <= mid)
ans = max(ans,query_max(lson(p),l,r));
if(r > mid)
ans = max(ans,query_max(rson(p),l,r));
return ans;
}
inline ll query_min(ll p,ll l,ll r)
{
if(l <= t[p].l && t[p].r <= r)
return t[p].minn;
ll ans = INF;
ll mid = t[p].l + t[p].r >> 1;
if(l <= mid)
ans = min(ans,query_min(lson(p),l,r));
if(r > mid)
ans = min(ans,query_min(rson(p),l,r));
return ans;
}
};
segment_tree t;
dual_segment_tree pos;
dual_segment_tree neg;
inline ll read()
{
ll x = 0;
ll y = 1;
char c = getchar();
while(c < '0' || c > '9')
{
if(c == '-')
y = -y;
c = getchar();
}
while(c >= '0' && c <= '9')
{
x = (x << 3) + (x << 1) + (c ^ '0');
c = getchar();
}
return x * y;
}
inline void write(ll x)
{
if(x < 0)
{
putchar('-');
write(-x);
return;
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
int main()
{
n = read();
m = read();
q = read();
pos.build(1,1,n);
neg.build(1,1,n);
rep(i,1,n)
{
a[i] = read();
if(a[i] >= 0)
{
pos.update(1,i,a[i],false);
neg.update(1,i,a[i],true);
}
else
{
pos.update(1,i,a[i],true);
neg.update(1,i,a[i],false);
}
}
rep(i,1,m)
{
b[i] = read();
t.update(1,i,b[i]);
}
rep(o,1,q)
{
ans = -INF;
ll l1 = 0;
ll r1 = 0;
ll l2 = 0;
ll r2 = 0;
l1 = read();
r1 = read();
l2 = read();
r2 = read();
ll max_t = t.query_max(1,l2,r2);
ll min_t = t.query_min(1,l2,r2);
ll max_pos = pos.query_max(1,l1,r1);
ll min_pos = pos.query_min(1,l1,r1);
ll max_neg = neg.query_max(1,l1,r1);
ll min_neg = neg.query_min(1,l1,r1);
if(max_pos != -INF)
ans = max(ans,max_pos * min_t);
if(min_pos != INF)
ans = max(ans,min_pos * min_t);
if(max_neg != -INF)
ans = max(ans,max_neg * max_t);
if(min_neg != INF)
ans = max(ans,min_neg * max_t);
write(ans);
putchar('\n');
}
return 0;
}
第二段代码错在哪里