#include <bits/stdc++.h>
using namespace std;
const int INFint = 2147483547;
const long long INF = 2223372036854775807ll;
const long long MOD = 1000000007ll;
class SegmentTree {
 public:
  int n;
  vector<long long> t;
  void modify(int pos, long long val) {
    pos += n;
    for (t[pos] = max(t[pos], val); pos > 1; pos >>= 1)
      t[pos >> 1] = max(t[pos], t[pos ^ 1]);
  }
  long long query(int l, int r) {
    long long res = 0;
    for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
      if (l & 1) res = max(res, t[l++]);
      if (r & 1) res = max(res, t[--r]);
    }
    return res;
  }
  SegmentTree(int n) : n(n) { t.resize(n << 1, 0); }
};
int main() {
  ios_base::sync_with_stdio(0);
  int n;
  cin >> n;
  SegmentTree sg(n);
  vector<long long> a, v;
  map<long long, int> pos;
  for (int i = 0; i < n; i++) {
    long long r, h;
    cin >> r >> h;
    a.push_back(r * r * h);
    v.push_back(a.back());
  }
  sort(v.begin(), v.end());
  for (int i = 0; i < v.size(); i++) pos[v[i]] = i;
  for (int i = 0; i < a.size(); i++) {
    int p = pos[a[i]];
    long long cur = sg.query(0, p);
    sg.modify(p, cur + a[i]);
  }
  cout << fixed << setprecision(9) << acos(-1.0) * sg.query(0, n);
  fprintf(stderr, "\nTIME = %lf\n", 1.0 * clock() / CLOCKS_PER_SEC);
  ;
  return 0;
}
