← Home
package main
 
import (
	"bufio"
	"fmt"
	"os"
)
 
const INF = int64(1e18)
 
var (
	tree []int64
	lazy []int64
)
 
func max(a, b int64) int64 {
	if a > b {
		return a
	}
	return b
}
 
func build(node, l, r int) {
	lazy[node] = 0
	if l == r {
		tree[node] = -INF
		return
	}
	mid := (l + r) / 2
	build(node*2, l, mid)
	build(node*2+1, mid+1, r)
	tree[node] = max(tree[node*2], tree[node*2+1])
}
 
func pushDown(node int) {
	if lazy[node] != 0 {
		tree[node*2] += lazy[node]
		lazy[node*2] += lazy[node]
		tree[node*2+1] += lazy[node]
		lazy[node*2+1] += lazy[node]
		lazy[node] = 0
	}
}
 
func updateSet(node, l, r, idx int, val int64) {
	if l == r {
		tree[node] = val
		lazy[node] = 0
		return
	}
	pushDown(node)
	mid := (l + r) / 2
	if idx <= mid {
		updateSet(node*2, l, mid, idx, val)
	} else {
		updateSet(node*2+1, mid+1, r, idx, val)
	}
	tree[node] = max(tree[node*2], tree[node*2+1])
}
 
func updateAdd(node, l, r, ql, qr int, val int64) {
	if ql <= l && r <= qr {
		tree[node] += val
		lazy[node] += val
		return
	}
	pushDown(node)
	mid := (l + r) / 2
	if ql <= mid {
		updateAdd(node*2, l, mid, ql, qr, val)
	}
	if qr > mid {
		updateAdd(node*2+1, mid+1, r, ql, qr, val)
	}
	tree[node] = max(tree[node*2], tree[node*2+1])
}
 
func queryMax(node, l, r, ql, qr int) int64 {
	if ql <= l && r <= qr {
		return tree[node]
	}
	pushDown(node)
	mid := (l + r) / 2
	res := -INF
	if ql <= mid {
		res = max(res, queryMax(node*2, l, mid, ql, qr))
	}
	if qr > mid {
		res = max(res, queryMax(node*2+1, mid+1, r, ql, qr))
	}
	return res
}
 
func main() {
	reader := bufio.NewReader(os.Stdin)
	var n int
	fmt.Fscan(reader, &n)
 
	h := make([]int, n+1)
	for i := 1; i <= n; i++ {
		fmt.Fscan(reader, &h[i])
	}
 
	b := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		fmt.Fscan(reader, &b[i])
	}
 
	tree = make([]int64, 4*(n+1))
	lazy = make([]int64, 4*(n+1))
 
	build(1, 0, n)
 
	dp := make([]int64, n+1)
	dp[0] = 0
 
	stack := make([]int, 0)
 
	for i := 1; i <= n; i++ {
		updateSet(1, 0, n, i-1, dp[i-1])
 
		for len(stack) > 0 && h[stack[len(stack)-1]] > h[i] {
			k := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			prev := 0
			if len(stack) > 0 {
				prev = stack[len(stack)-1]
			}
			updateAdd(1, 0, n, prev, k-1, -b[k])
		}
 
		prev := 0
		if len(stack) > 0 {
			prev = stack[len(stack)-1]
		}
		updateAdd(1, 0, n, prev, i-1, b[i])
 
		stack = append(stack, i)
		dp[i] = queryMax(1, 0, n, 0, i-1)
	}
 
	fmt.Println(dp[n])
}