#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;
    for(int i=0; i<n; i++){
        int x;
        cin>>x;
        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){
            while(p_v.size()>0){
                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;
}