#include <iostream>
#include <vector>
#include <cmath>
#include <map>
#include <set>
#include <unordered_map>
#include <queue>
#include <deque>
#include <algorithm>
#include <bitset>
#include <numeric>
#include <unordered_set>
#include <string>
using namespace std;
struct uc{
    long long a, b, cnt;
    uc(long long a=0, long long b=0, long long cnt=0): a(a), b(b), cnt(cnt) {}
};
int main(){
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int n;
    cin>>n;
    vector<uc> a(n);
    deque<long long> p_v; //по первой возможности
    for(int i=0; i<n; i++){
        cin>>a[i].a>>a[i].b;
        if(a[i].b<0){
            p_v.push_back(i);
        }
    }
    long long res=0, mx_res=-1e18;
    long long xpr=0;
    vector<int> p(n);
    vector<pair<int, int>> u(n);
    for(int i=0; i<n; i++){
        cin>>p[i];
        u[i]={p[i], i};
    }
    sort(u.begin(), u.end());
    for(int i=0; i<n; i++){
        int x=p[i];
        for(; xpr<x; xpr++){
            res+=a[xpr].a+a[xpr].b*i+a[xpr].cnt;
            a[xpr].a=0;
            a[xpr].b=0;
            a[xpr].cnt=0;
        }
        res+=a[i].a+a[i].b*i+a[i].cnt;
        if(x==-2){
            auto it=upper_bound(u.begin(), u.end(), make_pair(x, i));
            long long op;
            if(it==u.end()){
                op=1e18+1;
            } else {
                op=(*it).first;
            }
            while(p_v.size()>0 && p_v[0]<op){
                a[p_v[0]].cnt=a[p_v[0]].a+a[p_v[0]].b*i;
                a[p_v[0]].a=0; a[p_v[0]].b=0;
                p_v.pop_front();
            }
        }
        mx_res=max(res, mx_res);
    }
    cout<<mx_res;
    return 0;
}