#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 3e5 + 5;
// Đối với các bài dp liên quan đến stack thì đây là một dạng hay gặp
// Như trong bài này hoặc những bài tương tự thì công thức dp sẽ có dạng dp[i] = min/max{dp[j] + min/max{a[j + 1...i]}} với j < i
// Hay tóm lại là trong công thức dp có đề cập đến min/max của một đoạn
// Để tính được dp[i] thì ta xét 2 trường hợp như sau:
// Trường hợp 1: a[i] đóng vai trò là min (trường hợp a[i] đóng vai trò là max cũng tương tự):
// - Nhận xét: Gọi l[i] = Phần tử gần nhất bên trái < a[i]
// => a[i] sẽ đóng vai trò là min trong đoạn [j + 1, i] với l[i] <= j < i
// => dp[i] = min/max{dp[j]} + a[i] (với l[i] <= j < i)
// => Có thể tối ưu bằng Segment Tree
// Trường hợp 2: a[i] không đóng vai trò là min
// Có thể thấy rằng với j < l[i] thì a[i] không còn đóng vai trò là min trong đoạn [j + 1, i] nữa
// Ở đây có thể một số em nghĩ rằng sẽ phải xét rất nhiều trường hợp nhưng mọi thứ đơn giản chỉ là truy hồi về dp[l[i]]
// Có thể giải thích đơn giản là khi truy hồi về dp[l[i]] thì nó cũng sẽ xét qua trường hợp 1 là a[l[i]] đóng vai trò là min,
// còn trường hợp 2 a[l[i]] không đóng vai trò là min thì sẽ tiếp tục truy hồi về dp[l[l[i]]],... và cứ thế một cách "đệ quy"
int n;
int h[N];
int b[N];
ll seg[4 * N]; // seg[id] = max{dp[l..r]} do nút id quản lí
void update(int id, int l, int r, int pos, ll val) {
if (l > pos || r < pos) return;
if (l == r) {
seg[id] = val;
return;
}
int mid = (l + r) >> 1;
update(id * 2, l, mid, pos, val);
update(id * 2 + 1, mid + 1, r, pos, val);
seg[id] = max(seg[id * 2], seg[id * 2 + 1]);
}
ll getMax(int id, int l, int r, int u, int v) {
if (l > v || r < u) return -LINF;
if (u <= l && r <= v) return seg[id];
int mid = (l + r) >> 1;
return max(getMax(id * 2, l, mid, u, v), getMax(id * 2 + 1, mid + 1, r, u, v));
}
int l[N]; // l[i] = phần tử gần nhất bên trái < h[i]
ll dp[N]; // dp[i] = Đáp án tối ưu khi xét các toà nhà từ 1 đến i
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) cin >> h[i];
for (int i = 1; i <= n; i++) cin >> b[i];
vector<int> st;
for (int i = 1; i <= n; i++) {
while (!st.empty() && h[st.back()] >= h[i]) st.pop_back();
l[i] = st.empty() ? 0 : st.back();
st.push_back(i);
}
dp[0] = 0;
update(1, 0, n, 0, dp[0]);
for (int i = 1; i <= n; i++) {
dp[i] = getMax(1, 0, n, l[i], i - 1) + b[i]; // Trường hợp 1
if (l[i] > 0) dp[i] = max(dp[i], dp[l[i]]); // Trường hợp 2
update(1, 0, n, i, dp[i]);
}
cout << dp[n] << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAzZTUgKyA1OyAKCi8vIMSQ4buRaSB24bubaSBjw6FjIGLDoGkgZHAgbGnDqm4gcXVhbiDEkeG6v24gc3RhY2sgdGjDrCDEkcOieSBsw6AgbeG7mXQgZOG6oW5nIGhheSBn4bq3cAovLyBOaMawIHRyb25nIGLDoGkgbsOgeSBob+G6t2Mgbmjhu69uZyBiw6BpIHTGsMahbmcgdOG7sSB0aMOsIGPDtG5nIHRo4bupYyBkcCBz4bq9IGPDsyBk4bqhbmcgZHBbaV0gPSBtaW4vbWF4e2RwW2pdICsgbWluL21heHthW2ogKyAxLi4uaV19fSB24bubaSBqIDwgaSAKLy8gSGF5IHTDs20gbOG6oWkgbMOgIHRyb25nIGPDtG5nIHRo4bupYyBkcCBjw7MgxJHhu4EgY+G6rXAgxJHhur9uIG1pbi9tYXggY+G7p2EgbeG7mXQgxJFv4bqhbgovLyDEkOG7gyB0w61uaCDEkcaw4bujYyBkcFtpXSB0aMOsIHRhIHjDqXQgMiB0csaw4budbmcgaOG7o3AgbmjGsCBzYXU6Ci8vIFRyxrDhu51uZyBo4bujcCAxOiBhW2ldIMSRw7NuZyB2YWkgdHLDsiBsw6AgbWluICh0csaw4budbmcgaOG7o3AgYVtpXSDEkcOzbmcgdmFpIHRyw7IgbMOgIG1heCBjxaluZyB0xrDGoW5nIHThu7EpOgovLyAtIE5o4bqtbiB4w6l0OiBH4buNaSBsW2ldID0gUGjhuqduIHThu60gZ+G6p24gbmjhuqV0IGLDqm4gdHLDoWkgPCBhW2ldCi8vICAgICAgICAgICAgID0+IGFbaV0gc+G6vSDEkcOzbmcgdmFpIHRyw7IgbMOgIG1pbiB0cm9uZyDEkW/huqFuIFtqICsgMSwgaV0gduG7m2kgbFtpXSA8PSBqIDwgaQovLyA9PiBkcFtpXSA9IG1pbi9tYXh7ZHBbal19ICsgYVtpXSAoduG7m2kgbFtpXSA8PSBqIDwgaSkKLy8gPT4gQ8OzIHRo4buDIHThu5FpIMawdSBi4bqxbmcgU2VnbWVudCBUcmVlCi8vIFRyxrDhu51uZyBo4bujcCAyOiBhW2ldIGtow7RuZyDEkcOzbmcgdmFpIHRyw7IgbMOgIG1pbgovLyBDw7MgdGjhu4MgdGjhuqV5IHLhurFuZyB24bubaSBqIDwgbFtpXSB0aMOsIGFbaV0ga2jDtG5nIGPDsm4gxJHDs25nIHZhaSB0csOyIGzDoCBtaW4gdHJvbmcgxJFv4bqhbiBbaiArIDEsIGldIG7hu69hCi8vIOG7niDEkcOieSBjw7MgdGjhu4MgbeG7mXQgc+G7kSBlbSBuZ2jEqSBy4bqxbmcgc+G6vSBwaOG6o2kgeMOpdCBy4bqldCBuaGnhu4F1IHRyxrDhu51uZyBo4bujcCBuaMawbmcgbeG7jWkgdGjhu6kgxJHGoW4gZ2nhuqNuIGNo4buJIGzDoCB0cnV5IGjhu5NpIHbhu4EgZHBbbFtpXV0KLy8gQ8OzIHRo4buDIGdp4bqjaSB0aMOtY2ggxJHGoW4gZ2nhuqNuIGzDoCBraGkgdHJ1eSBo4buTaSB24buBIGRwW2xbaV1dIHRow6wgbsOzIGPFqW5nIHPhur0geMOpdCBxdWEgdHLGsOG7nW5nIGjhu6NwIDEgbMOgIGFbbFtpXV0gxJHDs25nIHZhaSB0csOyIGzDoCBtaW4sCi8vIGPDsm4gdHLGsOG7nW5nIGjhu6NwIDIgYVtsW2ldXSBraMO0bmcgxJHDs25nIHZhaSB0csOyIGzDoCBtaW4gdGjDrCBz4bq9IHRp4bq/cCB04bulYyB0cnV5IGjhu5NpIHbhu4EgZHBbbFtsW2ldXV0sLi4uIHbDoCBj4bupIHRo4bq/IG3hu5l0IGPDoWNoICLEkeG7hyBxdXkiIAppbnQgbjsgCmludCBoW05dOyAKaW50IGJbTl07IAoKbGwgc2VnWzQgKiBOXTsgLy8gc2VnW2lkXSA9IG1heHtkcFtsLi5yXX0gZG8gbsO6dCBpZCBxdeG6o24gbMOtCgp2b2lkIHVwZGF0ZShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHBvcywgbGwgdmFsKSB7CglpZiAobCA+IHBvcyB8fCByIDwgcG9zKSByZXR1cm47IAoKCWlmIChsID09IHIpIHsKCQlzZWdbaWRdID0gdmFsOyAKCQlyZXR1cm47IAoJfQoKCWludCBtaWQgPSAobCArIHIpID4+IDE7IAoJdXBkYXRlKGlkICogMiwgbCwgbWlkLCBwb3MsIHZhbCk7IAoJdXBkYXRlKGlkICogMiArIDEsIG1pZCArIDEsIHIsIHBvcywgdmFsKTsgCgoJc2VnW2lkXSA9IG1heChzZWdbaWQgKiAyXSwgc2VnW2lkICogMiArIDFdKTsgCn0KCmxsIGdldE1heChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KSB7CglpZiAobCA+IHYgfHwgciA8IHUpIHJldHVybiAtTElORjsgCgoJaWYgKHUgPD0gbCAmJiByIDw9IHYpIHJldHVybiBzZWdbaWRdOyAKCglpbnQgbWlkID0gKGwgKyByKSA+PiAxOyAKCXJldHVybiBtYXgoZ2V0TWF4KGlkICogMiwgbCwgbWlkLCB1LCB2KSwgZ2V0TWF4KGlkICogMiArIDEsIG1pZCArIDEsIHIsIHUsIHYpKTsgCn0KCmludCBsW05dOyAvLyBsW2ldID0gcGjhuqduIHThu60gZ+G6p24gbmjhuqV0IGLDqm4gdHLDoWkgPCBoW2ldCQpsbCBkcFtOXTsgLy8gZHBbaV0gPSDEkMOhcCDDoW4gdOG7kWkgxrB1IGtoaSB4w6l0IGPDoWMgdG/DoCBuaMOgIHThu6sgMSDEkeG6v24gaSAKCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuOyAKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IGhbaV07IAkKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IGJbaV07IAoKCXZlY3RvcjxpbnQ+IHN0OyAgCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCQl3aGlsZSAoIXN0LmVtcHR5KCkgJiYgaFtzdC5iYWNrKCldID49IGhbaV0pIHN0LnBvcF9iYWNrKCk7IAoJCWxbaV0gPSBzdC5lbXB0eSgpID8gMCA6IHN0LmJhY2soKTsgIAoJCXN0LnB1c2hfYmFjayhpKTsgCgl9CgoJZHBbMF0gPSAwOyAgIAoJdXBkYXRlKDEsIDAsIG4sIDAsIGRwWzBdKTsgCgoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJZHBbaV0gPSBnZXRNYXgoMSwgMCwgbiwgbFtpXSwgaSAtIDEpICsgYltpXTsgLy8gVHLGsOG7nW5nIGjhu6NwIDEKCQlpZiAobFtpXSA+IDApIGRwW2ldID0gbWF4KGRwW2ldLCBkcFtsW2ldXSk7IC8vIFRyxrDhu51uZyBo4bujcCAyCgkJdXBkYXRlKDEsIDAsIG4sIGksIGRwW2ldKTsgCgl9CgoJY291dCA8PCBkcFtuXSA8PCAnXG4nOyAKfQ==