import std; void main () { int N = readln.chomp.to!int; auto A = new int[](N); auto B = new int[](N); foreach (i; 0 .. N) { readln.read(A[i], B[i]); } auto dp = new long[][](N + 1, N + 1); foreach (i; 0 .. N + 1) { dp[i][] = -long.max; } foreach (i; 0 .. N + 1) { dp[0][] = 0; } foreach (i; 0 .. N) { foreach (j; 0 .. N + 1) { if (dp[i][j] == -long.max) { continue; } // 攻撃する if (0 <= j - 1) { dp[i + 1][j - 1] = max(dp[i + 1][j - 1], dp[i][j] + B[i]); } // 攻撃しない dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + 1L * A[i] * j); } } writeln(dp[N][0]); } void read (T...) (string S, ref T args) { import std.conv : to; import std.array : split; auto buf = S.split; foreach (i, ref arg; args) { arg = buf[i].to!(typeof(arg)); } }