#include <bits/stdc++.h>
using namespace std;
bool debug = 0;
int n, m, k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
string direc = "RDLU";
long long ln, lk, lm;
long long c[100005], ans[100005];
int M, cnt;
long long T[(1 << 20) + 5];
map<long long, int> id;
void upt(int l, long long val) {
  l += M;
  T[l] = val;
  while (l > 1) {
    T[l >> 1] = max(T[l], T[l ^ 1]);
    l >>= 1;
  }
}
long long qy(int l, int r) {
  long long ans = 0;
  for (l = l + M - 1, r = r + M + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
    if (~l & 1) ans = max(ans, T[l ^ 1]);
    if (r & 1) ans = max(ans, T[r ^ 1]);
  }
  return ans;
}
void fmain() {
  scanf("%d", &n);
  for (int(i) = 1; (i) <= (int)(n); (i)++) {
    int r, h;
    scanf("%d%d", &r, &h);
    c[i] = (long long)r * r * h;
    id[c[i]];
    id[c[i] + 1];
  }
  for (auto &p : id) p.second = ++cnt;
  for (M = 1; cnt + 2 > M; M <<= 1)
    ;
  upt(id[c[n]], c[n]);
  ans[n] = c[n];
  for (int i = n - 1; i; i--) {
    ans[i] = qy(id[c[i] + 1], cnt) + c[i];
    upt(id[c[i]], ans[i]);
  }
  long long Ans = 0;
  for (int(i) = 1; (i) <= (int)(n); (i)++) Ans = max(Ans, ans[i]);
  long double z = Ans;
  z *= acos(-1);
  printf("%.10Lf\n", z);
}
int main() {
  fmain();
  return 0;
}
