#include <bits/stdc++.h>

using namespace std;

#define int int64_t

const int INF = 9e18;

int sum(pair<int,int> seg, vector<int> & pr)
{
    return pr[seg.second+1] - pr[seg.first];
}


signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    int a[n],b[n];
    vector<int> pr(n+1);
    pr[0] = 0;
    int maxb = 0;
    for(int i = 0;i < n;++i)
    {
        cin >> a[i] >> b[i];
        maxb = max(maxb,b[i]);
        pr[i+1] = pr[i] + b[i];
    }
    int p[n];
    for(int i = 0;i < n;++i)
    {
        cin >> p[i];
    }
   // cout << maxb << endl;
    if(maxb <= 0)
    {
        int pnt = 0;
        int res = -INF;
        int ans = 0;
        int mnmn = -1;
        for(int j = 0;j <= n;++j)
        {
            bool mv = 0;
            while(pnt < n && j >= p[pnt])
            {
                pnt++;
                mv = 1;
            }
            if(mv)
            {
                mnmn = -1;
                for(int u = pnt-1;u >= 0;--u)
                {
                    if(p[u] > -1)
                    {
                        mnmn = u;
                        break;
                    }
                }
            }
            if(pnt == n)
            {
                res = max(res,ans);
            }
            if(j == n)
                break;
            if(pnt == n && p[pnt-1] > -1)
            {
                break;
            }
            //cout << mnmn << endl;
            ans += a[j] + b[j] * (mnmn + 1);
        }
        cout << res;
        return 0;
    }
    // int res = -INF;
    // int suma = 0;
    // int ans = 0;
    // int pnt = 0;
    // vector<pair<int,int>> stack;
    // int lastpnt = -1;
    // for(int j = 0;j <= n;++j)
    // {
    //     bool mv = 0;
    //     while(pnt < n && j >= p[pnt])
    //     {
    //         pnt++;
    //         mv = 1;
    //     }
    //     if(pnt == n)
    //     {
    //         res = max(res,suma + ans);
    //     }
    //     if(j == n)
    //         break;
    //     if(mv)
    //     {
    //         stack.clear();
    //         lastpnt = -1;
    //         for(int u = pnt-1;u >= 0;--u)
    //         {
    //             if(p[u] > -1)
    //             {
    //                 lastpnt = u;
    //                 break;
    //             }
    //         }
    //     }
    //     if(lastpnt+1 == n)
    //     {
    //         break;
    //     }
    //     suma += a[j];
    //     stack.push_back({j,j});
    //     if(sum(stack.back(),pr) > 0)
    //     {
    //         ans += sum(stack.back(),pr) * min(j,pnt);
    //     }
    //     if(sum(stack.back(),pr) < 0)
    //     {
    //         ans += sum(stack.back(),pr) * (lastpnt+1);
    //     }
    //     while(stack.size() >= 2 && sum(stack.back(),pr) <= 0 && sum(stack[stack.size()-2],pr) >= 0)
    //     {
    //         int rg = stack.back().second;
    //         if(sum(stack.back(),pr) > 0)
    //         {
    //             ans -= sum(stack.back(),pr) * min(stack.back().first,pnt);
    //         }
    //         if(sum(stack.back(),pr) < 0)
    //         {
    //             ans -= sum(stack.back(),pr) * (lastpnt + 1);
    //         }
    //         stack.pop_back();
    //         if(sum(stack.back(),pr) > 0)
    //         {
    //             ans -= sum(stack.back(),pr)* min(stack.back().first,pnt);
    //         }
    //         if(sum(stack.back(),pr) < 0)
    //         {
    //             ans -= sum(stack.back(),pr) * (lastpnt + 1);
    //         }
    //         stack.back().second = rg;
    //         if(sum(stack.back(),pr) > 0)
    //         {
    //             ans += sum(stack.back(),pr)* min(stack.back().first,pnt);
    //         }
    //         if(sum(stack.back(),pr) < 0)
    //         {
    //             ans -= sum(stack.back(),pr) * (lastpnt + 1);
    //         }
    //     }
    //     if(pnt == n)
    //     {
    //         res = max(res,suma + ans);
    //     }
    //    // cout << ans << endl;
    // }
    // cout << res << "\n";
}