#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <random>
#include <set>
#include <map>

using namespace std;
using ll = long long;
using ld = long double;

const ll mod = 998244353;
const ll INF = 1e18 + 10;
const int SZ = 1e6 + 1;

//vector<int> g[SZ];
//vector
//
//struct segtree {
//	struct node {
//		ll lval, rval;
//		ll add, adda;
//		ll eq;
//		node(ll v = 0) : lval(v), rval(v) {
//			add = adda = 0;
//			eq = -INF;
//		}
//	};
//	int sz;
//	vector<node> tr;
//	segtree(const int n) {
//		sz = 1;
//		while (sz < n)
//			sz <<= 1;
//		tr.assign((sz << 1) - 1, node());
//	}
//
//	void push(const int v, const int sz2) {
//		if (tr[v].eq != -INF) {
//			tr[v * 2 + 1].eq = tr[v * 2 + 2].eq = tr[v].eq;
//			tr[v * 2 + 1].lval = tr[v * 2 + 1].rval = tr[v].eq;
//			tr[v * 2 + 2].lval = tr[v * 2 + 2].rval = tr[v].eq;
//
//			tr[v].add = tr[v].adda = 0;
//			tr[v].eq = -INF;
//			return;
//		}
//		if (tr[v].add) {
//			tr[v * 2 + 1].lval += tr[v].add;
//			tr[v * 2 + 2].lval += tr[v].add;
//			tr[v * 2 + 1].rval += tr[v].add;
//			tr[v * 2 + 2].rval += tr[v].add;
//			tr[v * 2 + 1].add += tr[v].add;
//			tr[v * 2 + 2].add += tr[v].add;
//			tr[v].add = 0;
//		}
//		if (tr[v].adda) {
//			tr[v * 2 + 1].lval;
//			tr[v * 2 + 2].lval += tr[v].adda * sz2;
//			tr[v * 2 + 1].rval += tr[v].adda * (sz2 - 1);
//			tr[v * 2 + 2].rval += tr[v].adda * ((sz2 << 1) - 1);
//			tr[v * 2 + 2].add += tr[v].adda * sz2;
//			tr[v].adda = 0;
//		}
//	}
//
//	pair<ll, int> _adda(const int v, const int l, const int r, const ll add, const ll adda) {
//		if (r - l == 1) {
//			tr[v].lval += add + adda * l;
//			tr[v].rval += add + adda * l;
//			return;
//		}
//		push(v, (r - l) >> 1);
//		if ()
//	}
//
//	void addap(const int ql, const ll add, const ll adda) {
//		auto p = _adda(0, 0, sz, add - adda * ql, adda);
//	}
//};


int main()
{
#ifdef _DEBUG
	freopen("input.txt", "r", stdin);
#endif
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	int n;
	cin >> n;
	vector<ll> a(n + 1), b(n + 1);
	vector<int> p(n + 1);
	vector<ll> dp(n + 1, 0);
	for (int i = 1; i <= n; i++)
		cin >> a[i] >> b[i];
	for (int i = 1; i <= n; i++)
		cin >> p[i];
	int t = 0;
	ll ans = 0;
	vector<pair<ll, ll>> ps;
	ps.push_back({ n, 0 });
	for (int i = n; i >= 1; i--)
		if (p[i] != -1)
			ps.push_back({ p[i], i });
	int i = 1;
	while (!ps.empty()) {
		while (i <= ps.back().first) {
			for (int j = t; j < i; j++) {
				if (j != t)
					dp[j] = max(dp[j] + a[i] + b[i] * j, dp[j - 1]);
				else
					dp[j] = dp[j] + a[i] + b[i] * j;
			}
			for (int j = i; j <= n; j++)
				dp[j] = dp[j - 1];
			i++;
			ans = max(ans, dp[i - 1]);
		}
		if (ps.back().second == 0) {
			for (int j = t; j <= n; j++)
				ans = max(ans, dp[j]);
			break;
		}
		ans = -INF;
		t = ps.back().second;
		for (int j = t + 1; j <= n; j++)
			dp[j] = dp[t];
		ps.pop_back();
	}
	cout << ans;
}