#include <bits/stdc++.h>
using namespace std;
long long rdtsc() {
  long long tmp;
  asm("rdtsc" : "=A"(tmp));
  return tmp;
}
inline int myrand() { return abs((rand() << 15) ^ rand()); }
inline int rnd(int x) { return myrand() % x; }
const int INF = (int)1.01e9;
const long double EPS = 1e-9;
const long double PI = acos(-1.0L);
void precalc() {}
struct SegmTree {
  const static int maxn = (1 << 17);
  long long a[maxn * 2];
  int n;
  void build(int _n) {
    for (n = 1; n < _n; n <<= 1)
      ;
    assert(n <= maxn);
    for (int i = 1; i < 2 * n; ++i) {
      a[i] = 0;
    }
  }
  void update(int pos, long long nval) {
    for (int v = pos + n; v; v >>= 1) {
      if (a[v] < nval) {
        a[v] = nval;
      } else {
        break;
      }
    }
  }
  long long get(int v, int l, int r, int l0, int r0) {
    if (l0 >= r || l >= r0) {
      return 0;
    }
    if (l0 <= l && r <= r0) {
      return a[v];
    }
    int m = (l + r) / 2;
    long long res = 0;
    res = max(res, get(2 * v, l, m, l0, r0));
    res = max(res, get(2 * v + 1, m, r, l0, r0));
    return res;
  }
  long long get(int l, int r) { return get(1, 0, n, l, r); }
} tree;
const int maxn = (int)1e5 + 10;
long long vs[maxn];
int n;
bool read() {
  if (scanf("%d", &n) < 1) {
    return 0;
  }
  for (int i = 0; i < n; ++i) {
    int r, h;
    scanf("%d%d", &r, &h);
    vs[i] = (long long)r * r * h;
  }
  return 1;
}
pair<long long, int> ps[maxn];
int vid[maxn];
void solve() {
  for (int i = 0; i < n; ++i) {
    ps[i] = make_pair(vs[i], i);
  }
  sort(ps, ps + n);
  int cnt = 0;
  for (int i = 0; i < n;) {
    int i0 = i;
    while (i < n && ps[i].first == ps[i0].first) {
      vid[ps[i].second] = cnt;
      ++i;
    }
    ++cnt;
  }
  tree.build(cnt);
  long long res = 0;
  for (int i = 0; i < n; ++i) {
    long long val = vs[i] + tree.get(0, vid[i]);
    res = max(res, val);
    tree.update(vid[i], val);
  }
  printf("%.18f\n", (double)(res * PI));
}
int main() {
  srand(rdtsc());
  precalc();
  while (1) {
    if (!read()) {
      break;
    }
    solve();
  }
  return 0;
}
