#include <bits/stdc++.h>
using namespace std;
const long long N = 1e5 + 10;
const long long inf = 1e18;
const long double pi = acos(-1.0);
long long f[N];
long long n;
long long g(long long x) { return (x & (x + 1)); }
void add(long long i, long long val) {
  while (i < n) {
    if (f[i] < val) f[i] = val;
    i = (i | (i + 1));
  }
}
long long get(long long v) {
  long long ans = 0;
  while (v >= 0) {
    if (f[v] > ans) ans = f[v];
    v = g(v) - 1;
  }
  return ans;
}
vector<pair<long long, long long> > vec;
int32_t main() {
  cin >> n;
  long long v[n + 1];
  for (long long i = 0; i < n; i++) {
    long long r, h;
    cin >> r >> h;
    v[i] = r * r * h;
    vec.push_back({v[i], i});
  }
  sort(vec.begin(), vec.end());
  vector<pair<long long, long long> > need;
  n = (long long)(vec.size());
  long long ans = 0;
  long long zn[n + 1];
  for (auto to : vec) {
    while (need.size() > 0 && (need.back().first != to.first))
      add(need.back().second, zn[need.back().second]), need.pop_back();
    long long h = to.first + get(to.second - 1);
    zn[to.second] = h;
    need.push_back({to.first, to.second});
  }
  add(need.back().second, zn[need.back().second]);
  for (long long i = 0; i < n; i++) ans = max(ans, f[i]);
  cout << fixed << setprecision(9) << (long double)(ans * pi);
  return 0;
}
