#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;

using ll = long long;
using ld = long double;

const int MAXN = 1e6+50;
const int MOD = 998244353;
const int INF = 1e9;
const ll LLINF = 1e16;
const ld EPS = 1e-9;
const int LOGN = 25;

ll binpow(ll x, ll k) {
    if (k == 0) return 1;
    if (k % 2 == 0) {
        ll d = binpow(x, k/2) % MOD;
        return d*d%MOD;
    }
    return x*(binpow(x, k-1))%MOD;
}
int n, q;

ll dp[int(1e6)+50]; // dp[i][j] = максимальный ответ на префиксе i, если i чела закончили обслуживать на j сек
bool was[int(1e6)+50]; // посещен ли ученик

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    cin >> n;
    vector<ll> a(n+1), b(n+1);
    for (int i = 1; i <= n; i++) cin >> a[i] >> b[i];
    int max_p = 0;
    vector<int> p(n+1); for (int i = 1; i <= n; i++) {
        cin >> p[i];
        if (p[i] != -1) max_p = max(max_p, i);
    }
    bool f = false;

    ll ans = -LLINF;

    dp[1] = a[1];
    for (int i = 2; i <= p[1]; i++) {
        was[i] = 1;
        dp[i] = dp[i-1]+a[i];
    }
    if (p[1] == max_p) {
        f = true;
        ans = max(ans, dp[p[1]]);
    }

    for (int i = 2; i <= n; i++) {
        for (int k = i; k <= max(i, p[i]); k++) {
            if (was[k]) continue;
            was[k] = 1;

            dp[k] = dp[k-1]+i*b[k];
            if (f) ans = max(ans, dp[k]);
        }
        if (p[i] == max_p) {
            f = true;
            ans = max(ans, dp[p[i]]);
        }
    }

    /*
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < i; j++) {
            if (dp[i][j] == -LLINF) cout << 'd' << ' ';
            else cout << (dp[i][j]) << ' ';
        }
        cout << '\n';
    }
    */

    /*
    for (int i = max_p; i <= n; i++) {
        for (int j = 0; j < i; j++) ans = max(ans, dp[i][j]);
    }
    */

    cout << ans;
}
