#include <bits/stdc++.h>

using namespace std;

struct Line {
    long long k = 0, b = LLONG_MIN / 2;
    long long eval(long long x) {
        return k * x + b;
    }
};

long long rmod(long long a, long long b) {
    long long ans = a % b;
    if(ans < 0) ans += b;
    return ans;
}

long long rdiv(long long a, long long b) {
    if(b < 0) return rdiv(-a, -b);
    return (a - rmod(a, b)) / b;
}

long long intersectX(Line a, Line b) {
    /*
    kx+b = Kx+B
    x(k-K) = B-b
    */
    return rdiv(a.k - b.k, b.b - a.b);
}

vector<Line> cht;
vector<long long> intPts;

void addLine(Line ln) {
    while(cht.size() > 1) {
        Line lnn = cht.back();
        long long ii = intersectX(ln, lnn);
        if(ii <= intPts.back()) {
            cht.pop_back();
            intPts.pop_back();
        }
    }
    intPts.push_back(intersectX(ln, cht.back()));
    cht.push_back(ln);
}

long long evalMax(long long x) {
    long long ans = LLONG_MIN / 2;
    for(Line ln : cht) ans = max(ans, ln.eval(x));
    return ans;
}

int main() {
    int n;
    cin >> n;
    vector<pair<long long, long long>> arr(n);
    for(int i = 0; i < n; i++) cin >> arr[i].first >> arr[i].second;
    vector<vector<long long>> dp(n);

    vector<int> p(n);
    for(int i = 0; i < n; i++) cin >> p[i];
    vector<pair<int, int>> tms(n);
    int lstt = 0, ltm = 0;
    for(int i = 0; i < n; i++) {
        if(p[i] == -1) continue;
        int tmm = i, cnt = p[i];
        for(int j = lstt; j < cnt; j++) {
            tms[j] = {ltm, tmm};
        }
        ltm = tmm + 1;
        lstt = cnt;
    }
    for(int i = lstt; i < n; i++) tms[i] = {ltm, n};

    dp[0] = vector<long long>(n, LLONG_MIN / 2);
    dp[0][0] = 0;
    int pidx = 0;
    long long negsum = 0;
    vector<long long> mxxbl(n, LLONG_MIN / 2);
    mxxbl[0] = 0;
    cht.clear();
    intPts.clear();
    cht.push_back(Line());
    intPts.push_back(LLONG_MIN);
    addLine({0, dp[0][0]});
    for(int i = 1; i < n; i++) {
        if(arr[i].second <= 0) {
            negsum += arr[i].second;
            mxxbl[i] = evalMax(negsum);
            continue;
        }
        dp[i] = vector<long long>(n, LLONG_MIN / 2);
        long long mxx = LLONG_MIN / 2;
        for(int j = 0; j <= i; j++) {
            mxx = max(mxx, dp[pidx][j] + negsum * j);
            dp[i][j] = max(dp[i][j], mxx + arr[i].second * j);
        }
        cht.clear();
        intPts.clear();
        cht.push_back(Line());
        intPts.push_back(LLONG_MIN);
        for(int j = 0; j <= i; j++) addLine({j, dp[i][j]});
        mxxbl[i] = *max_element(dp[i].begin(), dp[i].end());

        negsum = 0;
        pidx = i;
    }
    int mxx = *max_element(p.begin(), p.end()) - 1;
    long long ans = LLONG_MIN / 2;
    if(mxx < 0) ans = 0;
    // for(auto i : dp) {
    //     for(auto j : i) cout << j << ' ';
    //     cout << '\n';
    // }
    long long cs = 0;
    for(int i = 0; i < n; i++) {
        cs += arr[i].first;
        if(i < mxx) continue;
        ans = max(ans, mxxbl[i] + cs);
    }
    cout << ans << '\n';
}
