#include <bits/stdc++.h>
#include <experimental/random>

using namespace std;
using ll = long long;
using ld = long double;

const ll INF = 2e18, MOD = 998244353;

void solve();

int main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    int q = 1;
    // cin >> q;
    while (q--) {
        solve();
    }
}

void solve() {
    ll n;
    cin >> n;
    vector<ll> a(n), b(n);
    vector<ll> pref = {0};
    for (int i = 0; i < n; i++) {
        cin >> a[i] >> b[i];
        pref.push_back(pref.back() + b[i]);
        if (i != 0) a[i] += a[i - 1];
    }

    vector<ll> p(n), tm(n), tm2(n);
    for (int i = 0; i < n; i++) {
        tm[i] = i;
    }
    ll opt = -1;
    for (int i = 0; i < n; i++) {
        cin >> p[i];
        if (p[i] != -1) {
            opt = max(opt, p[i] - 1);
        }
        if (p[i] != -1) {
            tm[p[i] - 1] = min(tm[p[i] - 1], (ll)i);
            if (p[i] < n) {
                tm2[p[i]] = max(tm2[p[i]], (ll)(i + 1));
            }
        }
    }

    for (int i = 1; i < n; i++) {
        tm2[i] = max(tm2[i], tm2[i - 1]);
    }

    for (ll i = n - 2; i >= 0; i--) {
        tm[i] = min(tm[i], tm[i + 1]);
    }

    ll ans = -INF;

    if (opt == -1) {
        opt = 0;
        ans = 0;
    }

    vector<pair<ll, ll>> st;
    ll sm = 0;
    for (int k = 0; k < n; k++) {
        ll lst2 = 0;
        if (!st.empty()) {
            lst2 = max(st.back().second, tm[st.back().first]);
        } else if (k != 0) {
            lst2 = tm2[k - 1];
        }
        sm += lst2 * b[k];

        while (!st.empty() && pref[k + 1] - pref[st.back().first] <= 0) {
            ll lst = 0;
            if (st.size() > 1) {
                lst = max(st[st.size() - 2].second, tm[st[st.size() - 2].first]);
            } else if (st.back().first != 0) {
                lst = tm2[st.back().first - 1];
            }

            sm -= (pref[k + 1] - pref[st.back().first]) * (tm[st.back().first] - lst);
            sm += (pref[k + 1] - pref[st.back().first]) * max(0ll, (tm2[st.back().first] - lst));
            ll nado = max(lst, tm2[st.back().first]);

            for (ll j = st.back().first + 1; j < k; j++) {
                ll pred = nado;
                nado = max(nado, tm2[j]);
                sm += (pref[k + 1] - pref[j]) * (nado - pred);
            }

            ll x = max(st.back().second, tm2[st.back().first]);
            st.pop_back();

            if (!st.empty()) {
                st.back().second = max(st.back().second, x);
            }
        }

        while (!st.empty() && pref[k + 1] - pref[st.back().first] <= b[k]) {
            ll lst = 0;
            if (st.size() > 1) {
                lst = max(st[st.size() - 2].second, tm[st[st.size() - 2].first]);
            } else if (st.back().first != 0) {
                lst = tm2[st.back().first - 1];
            }

            sm -= (pref[k + 1] - pref[st.back().first]) * (tm[st.back().first] - lst);
            sm += (pref[k + 1] - pref[st.back().first]) * max(0ll, (tm2[st.back().first] - lst));
            ll nado = max(lst, tm2[st.back().first]);

            for (ll j = st.back().first + 1; j < k; j++) {
                ll pred = nado;
                nado = max(nado, tm2[j]);
                sm += (pref[k + 1] - pref[j]) * (nado - pred);
            }

            ll x = max(st.back().second, tm2[st.back().first]);
            st.pop_back();

            if (!st.empty()) {
                st.back().second = max(st.back().second, x);
            }
        }

        lst2 = 0;
        if (!st.empty()) {
            lst2 = max(st.back().second, tm[st.back().first]);
        } else if (k != 0) {
            lst2 = tm2[k - 1];
        }

        if (b[k] > 0) {
            sm += (tm[k] - lst2) * b[k];
            st.emplace_back(k, 0);
        } else {
            sm += max(0ll, (tm2[k] - lst2)) * b[k];
            if (!st.empty()) {
                st.back().second = max(st.back().second, tm2[k]);
            }
        }

        if (k >= opt) {
            ans = max(ans, a[k] + sm);
        }
    }
    cout << ans;
}