#include <bits/stdc++.h>
using namespace std;
const int maxn = 300105, maxm = 200005, INF = 0x3fffffff;
long long dp[maxn];
long long v[maxm], tv[maxm];
void build(int k, int l, int r) {
  dp[k] = 0;
  if (l == r - 1) return;
  int mid = (l + r) / 2;
  build(2 * k + 1, l, mid);
  build(2 * k + 2, mid, r);
}
void update(int num, long long x, int k, int l, int r) {
  dp[k] = max(dp[k], x);
  if (l == r - 1) return;
  int mid = (l + r) / 2;
  if (mid > num)
    update(num, x, k * 2 + 1, l, mid);
  else
    update(num, x, k * 2 + 2, mid, r);
}
long long query(int a, int b, int k, int l, int r) {
  if (a >= r || b <= l)
    return 0;
  else if (a <= l && b >= r)
    return dp[k];
  else {
    int mid = (l + r) / 2;
    long long ta = query(a, b, k * 2 + 1, l, mid);
    long long tb = query(a, b, k * 2 + 2, mid, r);
    return max(ta, tb);
  }
}
int main(void) {
  int n;
  scanf("%d", &n);
  long long r, h;
  for (int i = 0; i < n; i++) {
    scanf("%I64d%I64d", &r, &h);
    tv[i] = v[i] = r * r * h;
  }
  sort(tv, tv + n);
  int tot = unique(tv, tv + n) - tv;
  build(0, 0, tot);
  long long res = 0;
  for (int i = 0; i < n; i++) {
    int pos = lower_bound(tv, tv + tot, v[i]) - tv;
    long long tmp = query(0, pos, 0, 0, tot) + v[i];
    res = max(res, tmp);
    update(pos, tmp, 0, 0, tot);
  }
  printf("%.10lf\n", res * acos(-1.0));
  return 0;
}
