#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
long long n, b[1 << 17];
long long a[1 << 17], ans, t[1 << 21];
vector<pair<long long, long long>> vec;
long long r, h;
void upd(long long nod, long long l, long long r, long long pos,
         long long val) {
  if (l == r) {
    t[nod] = max(t[nod], val);
    return;
  }
  long long mid = l + r >> 1;
  if (pos <= mid)
    upd(nod << 1, l, mid, pos, val);
  else
    upd(nod << 1 | 1, mid + 1, r, pos, val);
  t[nod] = max(t[nod << 1], t[nod << 1 | 1]);
}
long long qry(long long nod, long long tl, long long tr, long long l,
              long long r) {
  if (l > r) return 0;
  if (tl == l && tr == r) return t[nod];
  long long mid = tl + tr >> 1;
  return max(qry(nod << 1, tl, mid, l, min(mid, r)),
             qry(nod << 1 | 1, mid + 1, tr, max(mid + 1, l), r));
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cerr.tie(0);
  cout.tie(0);
  cin >> n;
  setprecision(100);
  for (long long i = 1; i <= n; i++) {
    cin >> r >> h;
    a[i] = r * r * h;
    vec.push_back(make_pair(a[i], i));
  }
  vec.push_back(make_pair(0, 0));
  sort(vec.begin(), vec.end());
  long long k = 0;
  for (long long i = 1; i < vec.size(); i++) {
    if (vec[i].first != vec[i - 1].first) ++k;
    b[vec[i].second] = k;
  }
  for (long long i = 1; i <= n; i++) {
    long long mx = qry(1, 0, 100005, 0, b[i] - 1);
    ans = max(ans, mx + a[i]);
    upd(1, 0, 100005, b[i], mx + a[i]);
  }
  return cout << fixed << setprecision(100) << (long double)(acos(-1)) * ans, 0;
}
