#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const long long MOD = 1e9 + 7;
long long a[100005], b[100005], c[100005];
int n;
long long maxn[500000];
long long query(int l, int r, int rt, int L, int R) {
  if (L <= l && R >= r) return maxn[rt];
  int mid = (l + r) / 2;
  long long le = 0, ri = 0;
  if (L <= mid) le = query(l, mid, rt * 2, L, R);
  if (R > mid) ri = query(mid + 1, r, rt * 2 + 1, L, R);
  return max(le, ri);
}
void update(int l, int r, int rt, int c, long long val) {
  if (l == r) {
    if (val > maxn[rt]) maxn[rt] = val;
    return;
  }
  int mid = (l + r) >> 1;
  if (c <= mid)
    update(l, mid, rt * 2, c, val);
  else if (c > mid)
    update(mid + 1, r, rt * 2 + 1, c, val);
  maxn[rt] = max(maxn[rt * 2], maxn[rt * 2 + 1]);
}
int main() {
  scanf("%d", &n);
  int x, y;
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &x, &y);
    a[i] = (long long)x * x * y;
    b[i] = a[i];
  }
  sort(b + 1, b + n + 1);
  int m = unique(b + 1, b + n + 1) - b - 1;
  for (int i = 1; i <= n; i++) c[i] = lower_bound(b + 1, b + m + 1, a[i]) - b;
  memset(maxn, 0, sizeof(maxn));
  long long ans = 0;
  for (int i = 1; i <= n; i++) {
    long long tem;
    if (c[i] == 1)
      tem = 0;
    else
      tem = query(1, m, 1, 1, c[i] - 1);
    update(1, m, 1, c[i], tem + a[i]);
    ans = max(ans, tem + a[i]);
  }
  double t = ans * acos(-1);
  printf("%.12f\n", t);
}
