#include <iostream>
#include <vector>
#include <stack>
#include <climits>

using namespace std;

int main() {
    int n;
    cin >> n;

    vector<long long> heights(n);
    vector<long long> costs(n);

    for (int i = 0; i < n; i++) {
        cin >> heights[i];
    }

    for (int i = 0; i < n; i++) {
        cin >> costs[i];
    }

    vector<long long> left_costs(n);  // Массив для хранения минимальных стоимостей закрытия слева
    vector<long long> right_costs(n); // Массив для хранения минимальных стоимостей закрытия справа

    stack<int> s; // Стек для хранения индексов колонн, которые еще не имеют правого "кандидата"

    // Рассчитываем минимальные стоимости закрытия слева
    for (int i = 0; i < n; i++) {
        while (!s.empty() && heights[s.top()] <= heights[i]) {
            s.pop();
        }

        if (!s.empty()) {
            left_costs[i] = left_costs[s.top()] + costs[i];
        }

        s.push(i);
    }

    while (!s.empty()) {
        s.pop();
    }

    // Рассчитываем минимальные стоимости закрытия справа
    for (int i = n - 1; i >= 0; i--) {
        while (!s.empty() && heights[s.top()] <= heights[i]) {
            s.pop();
        }

        if (!s.empty()) {
            right_costs[i] = right_costs[s.top()] + costs[i];
        }

        s.push(i);
    }

    long long min_cost = LONG_MAX;

    for (int i = 0; i < n; i++) {
        min_cost = min(min_cost, left_costs[i] + right_costs[i] - costs[i]);
    }

    cout << min_cost << endl;

    return 0;
}