#include <bits/stdc++.h>
using namespace std;
;
const long long maxn = 1e5 + 7;
const long double pi = 3.14159265358979323846;
struct pirog {
  long long r;
  long long h;
  long long i;
};
long long V[4 * maxn];
pirog A[maxn];
vector<pirog> C;
void update(long long v, long long tl, long long tr, long long i,
            long long color) {
  if (tl == tr) {
    V[v] = color;
    return;
  }
  long long tm = (tl + tr) / 2;
  if (tm >= i) {
    update(2 * v, tl, tm, i, color);
  } else {
    update(2 * v + 1, tm + 1, tr, i, color);
  }
  V[v] = max(V[2 * v], V[2 * v + 1]);
}
long long mx(long long v, long long tl, long long tr, long long l,
             long long r) {
  if (tl > r || l > tr) {
    return 0;
  }
  if (tl == l && tr == r) {
    return V[v];
  }
  long long tm = (tl + tr) / 2;
  return max(mx(2 * v, tl, tm, l, min(tm, r)),
             mx(2 * v + 1, tm + 1, tr, max(l, tm + 1), r));
}
bool cmp(pirog a, pirog b) { return a.h * a.r * a.r < b.h * b.r * b.r; }
long long X[maxn];
int main() {
  long long q, w, e, k, n;
  cin >> n;
  cout << fixed << setprecision(10);
  for (q = 0; q < n; q++) {
    cin >> A[q].r >> A[q].h;
    A[q].i = q;
    C.push_back(A[q]);
  }
  sort(C.begin(), C.end(), cmp);
  long long l = 0;
  for (q = 0; q < n; q++) {
    long long x = mx(1, 0, n - 1, 0, C[q].i) + C[q].h * C[q].r * C[q].r;
    X[q] = x;
    if (C[q].r * C[q].r * C[q].h == C[q + 1].r * C[q + 1].r * C[q + 1].h) {
      continue;
    }
    for (w = l; w <= q; w++) {
      update(1, 0, n - 1, C[w].i, X[w]);
    }
    l = q + 1;
  }
  cout << mx(1, 0, n - 1, 0, n - 1) * pi;
  return 0;
}
