← 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])
}