import sys,random,bisect from collections import deque,defaultdict from heapq import heapify,heappop,heappush from itertools import permutations from math import gcd from fractions import Fraction input = lambda :sys.stdin.readline().rstrip() mi = lambda :map(int,input().split()) li = lambda :list(mi()) local_test = False def random_test(N): item = [(N,random.randint(-10**9,10**9))] for i in range(1,N): c = random.randint(1,N) v = random.randint(-10**9,10**9) item.append((c,v)) return item INF = 10**17 N = int(input()) assert N <= 500 if local_test: item = random_test(N) else: item = [tuple(mi()) for i in range(N)] dp = [[-INF]*(N+1) for i in range(N+1)] dp[0][0] = 0 for i in range(N)[::-1]: c,v = item[i] k_max = N for w_start in range(i+1): for k_start in range(k_max+1): deq = deque() for k in range(k_start,k_max+1): w = w_start + (k-k_start) * (i+1) if N < w: break if deq and deq[0][1] < k-c: deq.popleft() tmp = dp[w][k] - k * v while deq and deq[0][0] <= tmp: deq.pop() deq.append((tmp,k)) dp[w][k] = v*k + deq[0][0] for w_start in range(i+1,N+1): for k_start in range(1): deq = deque() for k in range(k_start,k_max+1): w = w_start + (k-k_start) * (i+1) if N < w: break if deq and deq[0][1] < k-c: deq.popleft() tmp = dp[w][k] - k * v while deq and deq[0][0] <= tmp: deq.pop() deq.append((tmp,k)) dp[w][k] = v*k + deq[0][0] for k in range(1,N+1): res = max(dp[w][k] for w in range(N+1)) print(res)