#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <map>

using namespace std;
using ll = long long;

constexpr int INF = 1e9 + 7;
constexpr ll LINF = 1e18 + 7;
constexpr int MOD = 998244353;
//
// struct SegmentTree {
//    struct node {
//       ll s;
//       int mx;
//       int l, r;
//       node() {
//          s = 0;
//          mx = 0;
//          l = -1;
//          r = -1;
//       }
//    };
//
//    vector<node>tree;
//
//    inline int L(int v) {
//       if (tree[v].l == -1) {
//          tree[v].l = tree.size();
//          tree.push_back(node());
//       }
//       return tree[v].l;
//    }
//
//    inline int R(int v) {
//       if (tree[v].r == -1) {
//          tree[v].r = tree.size();
//          tree.push_back(node());
//       }
//       return tree[v].r;
//    }
//
//    void build(vector<int>&a, int l, int r, int v) {
//       if (r - l == 1) {
//          tree[v].s = tree[v].mx = a[l];
//          return;
//       }
//       int mid = (l + r) / 2;
//       build(a, l, mid, L(v));
//       build(a, mid, r, R(v));
//       tree[v].s = tree[L(v)].s + tree[R(v)].s;
//       tree[v].mx = max(tree[L(v)].mx, tree[R(v)].mx);
//    }
//
//    int getmax(int ql, int qr ,int l, int r, int v) {
//       if (qr <= l || ql >= r) return -INF;
//       if (ql <= l && r <= qr) return tree[v].mx;
//       int mid = (l + r) / 2;
//       return max(getmax(ql, qr, l, mid, L(v)), getmax(ql, qr, mid, r, R(v)));
//    }
//
//
//    ll getsum(int ql, int qr, int l, int r, int v) {
//       if (qr <= l || ql >= r) return 0;
//       if (ql <= l && r <= qr) return tree[v].s;
//       int mid = (l + r) / 2;
//       return getsum(ql, qr, l, mid, L(v)) + getsum(ql, qr, mid, r, R(v));
//    }
//
//    SegmentTree(vector<int>&a) {
//       int n = a.size();
//       build(a, 0, n, 0);
//    }
// };

ll binpow(ll s, ll n) {
	if (n == 0) return 1;
	if (n & 1) return binpow(s, n - 1) * s % MOD;
	ll d = binpow(s, n / 2);
	return d * d % MOD;
}

int main() {
	cin.tie(0)->sync_with_stdio(0);
	int n;
	cin >> n;
	vector<ll>a(n);
	vector<ll>b(n);
	for (int i = 0; i < n; ++i) {
		cin >> a[i]>>b[i];
	}
	vector<int>p(n);
	for (int i =0 ; i < n; ++i) cin >> p[i];
	vector<vector<ll>>dp(n + 1, vector<ll>(n + 1, -LINF));
	dp[0][0] = 0;
	ll mx = 0;
	for (int i = 1; i <= n; ++i) {
		for (int t = 0; t < i; ++t) {
			int lst = i - 1;
			if (i - 1 > t || i - 1 == 0) {
				dp[i][t] = max(dp[i][t], dp[lst][t] + a[i - 1] + b[i - 1] * t);
			}
			if (t > 0) {
				dp[i][t] = max(dp[i][t], dp[lst][t - 1] + a[i - 1] + b[i - 1] * t);
			}
			mx = max(mx, dp[i][t]);
		}
	}
	// for (auto c : dp) {
	// 	for (auto y : c) cout <<y<<' ';
	// 	cout <<'\n';
	// }
	cout <<mx<<"\n";
}