#include <bits/stdc++.h>

using namespace std;
using ll = long long;

// pair<vector<int>,vector<int>> suff_mass(string s) {
//     s += '#';
//     int n = s.size();
//
//     vector<int> ord(n,0);
//     vector<int> col(n,0);
//
//     iota(ord.begin(),ord.end(),0);
//
//     sort(ord.begin(),ord.end(),[&](int i,int j){
//     return s[i] < s[j];
//     });
//
//     for (auto i : ord) {
//         cout << i << ' ';
//     }cout << endl;
//
//     int lst = 0;
//     col[ord[0]] = lst;
//     for (int i=1;i<n;i++) {
//         if (s[ord[i]] != s[ord[i-1]]) {
//             lst++;
//         }
//         col[ord[i]] = lst;
//     }
//
//     for (auto i : col) {
//         cout << i << ' ';
//     }cout << endl;
//
//     for (int l=1;lst<n;l*=2) {
//         vector<int> n_ord(n,0),n_pos(n,0);
//
//         vector<int> cnt(lst+2,0);
//         for (int i=0;i<n;i++) {
//             cnt[col[i]+1]++;
//         }
//
//         for (int i=1;i<cnt.size();i++) {
//             cnt[i] += cnt[i-1];
//         }
//
//         int n_lst = 0;
//
//         for (int i=0;i<n;i++) {
//             int i1 = (i-l+n)%n;
//             n_ord[cnt[col[ord[i]]]] = i1;
//             n_col[i1] = n_lst;
//             cnt[col[ord[i]]]++;
//
//         }
//     }
//     return {{},{}};
// }

void solve() {
    int n;
    cin >> n;
    vector<pair<int,int>> vec(n,{0,0});
    for (int i=0;i<n;i++) {
        cin >> vec[i].first >> vec[i].second;
    }

    vector<int> tmax(n);
    vector<int> tmin(n,0);
    iota(tmax.begin(),tmax.end(),0);

    int p_max = 0;

    for (int i=0;i<n;i++) {
        int p;
        cin >> p;
        if (p == -1) {
            continue;
        }

        p_max = max(p_max,p);

        tmax[p-1] = i;
        if (p < n-1) {
            tmin[p] = i;
        }
    }

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

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

    // for (auto i : tmax) {
    //     cout << i << ' ';
    // }cout << endl;
    // for (auto i : tmin) {
    //     cout << i << ' ';
    // }cout << endl;

    vector<int> ans = {tmin[0]};
    if (vec[0].second > 0) {
        ans[0] = tmax[0];
    }

    ll ANS = 0;

    for (int i=1;i<n;i++) {
        if (vec[i].second > 0) {
            ans.push_back(tmax[i]);
        }else {
            ans.push_back(min(tmin[i],ans.back()));

            while (ans[i] > tmin[i]) {
                ll sm = 0;
                for (int j=i;j>=0;j--) {
                    if (ans[j] == ans[i]) {
                        sm -= vec[j].second;
                    }
                }
                if (sm >= 0) {
                    ans[i]--;
                }else {
                    break;
                }
            }
        }
        // for (auto X : ans) {
        //     cout << X << ' ';
        // }cout << endl;

        if (i+1 >= p_max) {
            ll sm = 0;
            for (int j=0;j<ans.size();j++) {
                sm += vec[j].first + vec[j].second * ans[j];
            }
            // cout << '!' << sm << endl;
            if (i+1 == p_max) {
                ANS = sm;
            }
            ANS = max(ANS,sm);

        }
    }

    cout << ANS;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int TTT;
    // cin >> TTT;
    TTT = 1;

    while (TTT--) {
        solve();
    }
}