#include <bits/stdc++.h>
using namespace std;
int di[] = {0, 0, 1, -1, 1, 1, -1, -1};
int dj[] = {1, -1, 0, 0, -1, 1, 1, -1};
double pi = 3.1415926535897;
const int N = 1e5 + 5;
int n, sz = 0;
unsigned long long nums[N], segTree[4 * N];
struct cake {
  int r, h;
} arr[N];
int nw(unsigned long long old) {
  return lower_bound(nums, nums + sz, old) - nums;
}
unsigned long long query(int e, int l = 0, int r = sz - 1, int pos = 1) {
  if (l > e) return 0;
  if (r <= e) return segTree[pos];
  int mid = (l + r) / 2;
  return max(query(e, l, mid, pos * 2), query(e, mid + 1, r, pos * 2 + 1));
}
void in(int ind, unsigned long long val, int l = 0, int r = sz - 1,
        int pos = 1) {
  if (ind > r || ind < l) return;
  segTree[pos] = max(segTree[pos], val);
  if (l == r) return;
  int mid = (l + r) / 2;
  in(ind, val, l, mid, pos * 2);
  in(ind, val, mid + 1, r, pos * 2 + 1);
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &arr[i].r, &arr[i].h);
    nums[sz++] = arr[i].r * 1ll * arr[i].r * arr[i].h;
  }
  sort(nums, nums + sz);
  sz = unique(nums, nums + sz) - nums;
  unsigned long long mx = 0;
  for (int i = 0; i < n; i++) {
    unsigned long long vol = arr[i].r * 1ll * arr[i].r * arr[i].h;
    unsigned long long add = query(nw(vol) - 1);
    in(nw(vol), vol + add);
    mx = max(mx, vol + add);
  }
  printf("%.8f", mx * pi);
}
