#include <bits/stdc++.h>
long long a[100010], b[100010], c[100010], t[400010];
int n, cnt;
using namespace std;
void init() {
  long long r, h;
  memset(a, 0, sizeof(a));
  memset(b, 0, sizeof(b));
  memset(c, 0, sizeof(c));
  for (int i = 0; i < n; i++)
    scanf("%I64d%I64d", &r, &h), a[i] = r * r * h, b[i] = a[i];
  sort(b, b + n);
  int pos = 0;
  long long tmp = b[pos];
  cnt = 0;
  c[cnt++] = b[pos];
  while (tmp < b[n - 1]) {
    pos += upper_bound(b, b + n, tmp) - upper_bound(b, b + n, tmp - 1);
    tmp = b[pos];
    c[cnt++] = b[pos];
  }
}
void SegModify(int L, int R, long long val, int l, int r, int x) {
  if (l == L && r == R) {
    t[x] = val;
    return;
  }
  int m = (l + r) / 2;
  if (R <= m)
    SegModify(L, R, val, l, m, x << 1);
  else if (L > m)
    SegModify(L, R, val, m + 1, r, x << 1 | 1);
  else {
    SegModify(L, m, val, l, m, x << 1);
    SegModify(m + 1, R, val, m + 1, r, x << 1 | 1);
  }
  t[x] = max(t[x << 1], t[x << 1 | 1]);
}
long long Query(int L, int R, int l, int r, int x) {
  if (L == l && R == r) {
    return t[x];
  }
  int m = (l + r) / 2;
  if (R <= m) return Query(L, R, l, m, x << 1);
  if (L > m) return Query(L, R, m + 1, r, x << 1 | 1);
  return max(Query(L, m, l, m, x << 1), Query(m + 1, R, m + 1, r, x << 1 | 1));
}
void solve() {
  long long ans = 0;
  for (int i = 0; i < n; i++) {
    long long q = upper_bound(c, c + cnt, a[i]) - c + 1;
    long long res = Query(1, q - 1, 1, 100000, 1) + a[i];
    ans = max(res, ans);
    SegModify(q, q, res, 1, 100000, 1);
  }
  printf("%.9lf", (double)3.14159265358979 * ans);
}
int main() {
  while (~scanf("%d", &n)) {
    init();
    solve();
  }
  return 0;
}
