|
|
|
|
@ -18,6 +18,7 @@ struct SegTree
|
|
|
|
|
struct Node
|
|
|
|
|
{
|
|
|
|
|
ll sum, lmx, lmn, rmx, rmn;
|
|
|
|
|
void init(const int x) { sum = x, lmx = x, lmn = x, rmx = x, rmn = x; }
|
|
|
|
|
} N[sz << 2];
|
|
|
|
|
void merge(Node &c, Node &l, Node &r)
|
|
|
|
|
{
|
|
|
|
|
@ -27,17 +28,17 @@ struct SegTree
|
|
|
|
|
c.lmx = max(l.lmx, l.sum + r.lmx);
|
|
|
|
|
c.rmx = max(r.rmx, r.sum + l.rmx);
|
|
|
|
|
}
|
|
|
|
|
void update(int k) { merge(N[k], N[L(k)], N[R(k)]); }
|
|
|
|
|
void build(int k, int l, int r, int *a)
|
|
|
|
|
{
|
|
|
|
|
if (l == r - 1) return void(N[k].mn = N[k].mx = 1);
|
|
|
|
|
if (l == r - 1) return N[k].init(a[l]);
|
|
|
|
|
int m = avg(l, r);
|
|
|
|
|
build(L(k), l, m, a);
|
|
|
|
|
build(R(k), m, r, a);
|
|
|
|
|
update(k);
|
|
|
|
|
merge(N[k], N[L(k)], N[R(k)]);
|
|
|
|
|
}
|
|
|
|
|
Node query(int k, int l, int r, int x, int y)
|
|
|
|
|
{
|
|
|
|
|
if (x >= y) return {};
|
|
|
|
|
if (x <= l && r <= y) return N[k];
|
|
|
|
|
int m = avg(l, r);
|
|
|
|
|
if (y <= m) return query(L(k), l, m, x, y);
|
|
|
|
|
@ -68,35 +69,28 @@ int main()
|
|
|
|
|
scanf("%d", &n);
|
|
|
|
|
for (int i = 1; i <= n; i++) read(a[i]);
|
|
|
|
|
for (int i = 1; i <= n; i++) read(b[i]);
|
|
|
|
|
a[0] = a[n + 1] = -inf;
|
|
|
|
|
v.clear(), v.push_back(0);
|
|
|
|
|
for (int i = 1; i <= n; i++)
|
|
|
|
|
{
|
|
|
|
|
while (a[v.back()] > a[i]) v.pop_back();
|
|
|
|
|
l[i] = v.back();
|
|
|
|
|
v.push_back(i);
|
|
|
|
|
while (a[v.back()] >= a[i]) v.pop_back();
|
|
|
|
|
l[i] = v.back(), v.push_back(i);
|
|
|
|
|
}
|
|
|
|
|
v.clear(), v.push_back(n + 1);
|
|
|
|
|
for (int i = n; i >= 1; i--)
|
|
|
|
|
{
|
|
|
|
|
while (a[v.back()] > a[i]) v.pop_back();
|
|
|
|
|
r[i] = v.back();
|
|
|
|
|
v.push_back(i);
|
|
|
|
|
while (a[v.back()] >= a[i]) v.pop_back();
|
|
|
|
|
r[i] = v.back(), v.push_back(i);
|
|
|
|
|
}
|
|
|
|
|
/*for (int i = 1; i <= n; i++) printf("%2d ", a[i]);
|
|
|
|
|
putchar('\n');
|
|
|
|
|
for (int i = 1; i <= n; i++) printf("%2d ", l[i]);
|
|
|
|
|
putchar('\n');
|
|
|
|
|
for (int i = 1; i <= n; i++) printf("%2d ", r[i]);
|
|
|
|
|
putchar('\n');*/
|
|
|
|
|
st.build(1, 0, n, b + 1);
|
|
|
|
|
long long ans = 0;
|
|
|
|
|
for (int i = 1; i <= n; i++)
|
|
|
|
|
{
|
|
|
|
|
int lb = l[i] + 1, rb = r[i];
|
|
|
|
|
auto resl = st.query(1, 0, n, lb, i);
|
|
|
|
|
auto resr = st.query(1, 0, n, i, rb);
|
|
|
|
|
ans = max(ans, a[i] < 0 ? a[i] * (resl.rmn + a[i] + resr.lmn) :
|
|
|
|
|
a[i] * (resl.rmx + a[i] + resr.lmx));
|
|
|
|
|
auto resl = st.query(1, 0, n, l[i], i - 1);
|
|
|
|
|
auto resr = st.query(1, 0, n, i, r[i] - 1);
|
|
|
|
|
ans = max(ans, a[i] < 0 ? a[i] * (resl.rmn + b[i] + resr.lmn) :
|
|
|
|
|
a[i] * (resl.rmx + b[i] + resr.lmx));
|
|
|
|
|
}
|
|
|
|
|
printf("%lld", ans);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|