#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}
long long int n,a[1000005],dp[5005][5005],can[5005],otg=-1e18;
int b[1000005],c[1000005];
void read()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i]>>b[i];
    }
    int to=1;
    for(int i=1;i<=n;i++)
    {
        cin>>c[i];
        if(c[i]!=-1)
        {
            for(int j=to;j<=c[i];j++)
            {
                can[j]=i;
            }
            to=c[i]+1;
        }
    }
    //cout<<endl;
    for(int i=to;i<=n;i++)
    {
        can[i]=i;
    }
    can[0]=n;
    int last=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=max(last,i);j<=n;j++)
        {
            dp[j][i]=-1e18;
            if(can[j-1]>=i)
            {
                dp[j][i]=max(dp[j][i],dp[j-1][i]+a[j]+b[j]*(i-1));
            }
            if(i>1)
            {
                dp[j][i]=max(dp[j][i],dp[j][i-1]+max(0,b[j]));
            }
            //cout<<dp[j][i]<<" "<<j<<" "<<i<<endl;
            if(c[i]!=-1&&j==c[i])
            {
                for(int z=1;z<j;z++)dp[z][i]=-1e18;
                otg=dp[j][i];
                break;
            }
            if(c[i]==-1)otg=max(otg,dp[j][i]);
        }
        if(c[i]!=-1)last=c[i];
    }
    cout<<otg<<endl;
}
int main()
{
    speed();
    read();
	return 0;
}
