#include <bits/stdc++.h>
using namespace std;
constexpr int N = 1e5 + 7;
constexpr long double eps = 1e-15;
int n;
long double seg[4 * N] = {};
long double query(int x, int tag = 1, int s = 0, int e = n) {
  if (e - s == 1) return seg[tag];
  int mid = (s + e) >> 1, L = tag << 1, R = L | 1;
  if (x < mid) {
    long double o = query(x, L, s, mid);
    if (o > seg[tag] + eps)
      return o;
    else
      return seg[tag];
  } else {
    long double o = query(x, R, mid, e);
    if (o > seg[tag] + eps)
      return o;
    else
      return seg[tag];
  }
}
void update(long double nw, int l, int r, int tag = 1, int s = 0, int e = n) {
  if (s >= l && e <= r) {
    if (nw > seg[tag] + eps) seg[tag] = nw;
    return;
  }
  if (s >= r || e <= l) return;
  int mid = (s + e) >> 1, L = tag << 1, R = L | 1;
  update(nw, l, r, L, s, mid);
  update(nw, l, r, R, mid, e);
}
long double val[N];
int place[N];
long double h[N], RR[N];
int32_t main() {
  ios::sync_with_stdio(0);
  cin >> n;
  long double ans = 0;
  vector<pair<long double, int> > v;
  for (int i = 0; i < n; i++) {
    cin >> RR[i] >> h[i];
    val[i] = RR[i] * (long double)1 * RR[i] * h[i];
    v.push_back({val[i], i});
  }
  sort(v.begin(), v.end());
  for (int i = 0; i < n; i++) place[v[i].second] = i;
  for (int i = n - 1; i >= 0; i--) {
    pair<long double, int> ooo = {val[i], -1};
    int pos = lower_bound(v.begin(), v.end(), ooo) - v.begin();
    long double qu = query(place[i]) + val[i];
    ans = max(ans, qu);
    update(qu, 0, pos);
  }
  ans *= 3.14159265358979323846264338327950288;
  cout << fixed << setprecision(9) << ans << endl;
}
