#include <bits/stdc++.h>
using namespace std;
struct Node {
  int l, r;
  long long Max;
} node[100005 * 4];
long long v[100005];
long long x[100005];
long long dp[100005];
const double PI = acos(-1.0);
void build(int id, int l, int r) {
  int mid = (l + r) >> 1;
  node[id].l = l;
  node[id].r = r;
  if (l == r) {
    node[id].Max = 0;
    return;
  }
  build(id * 2, l, mid);
  build(id * 2 + 1, mid + 1, r);
  node[id].Max = max(node[id * 2].Max, node[id * 2 + 1].Max);
}
void update(int id, int k, long long p) {
  int ll = node[id].l;
  int rr = node[id].r;
  int mid = (ll + rr) >> 1;
  if (ll == rr) {
    node[id].Max = p;
    return;
  }
  if (k <= mid)
    update(id * 2, k, p);
  else
    update(id * 2 + 1, k, p);
  node[id].Max = max(node[id * 2].Max, node[id * 2 + 1].Max);
}
long long query(int id, int l, int r) {
  int ll = node[id].l;
  int rr = node[id].r;
  int mid = (ll + rr) >> 1;
  if (l > r) return 0;
  if (ll == l && rr == r)
    return node[id].Max;
  else if (r <= mid)
    return query(id * 2, l, r);
  else if (l > mid)
    return query(id * 2 + 1, l, r);
  else
    return max(query(id * 2, l, mid), query(id * 2 + 1, mid + 1, r));
}
int main() {
  int n;
  while (cin >> n) {
    long long r, h;
    for (int i = 1; i <= n; i++) {
      scanf("%I64d%I64d", &r, &h);
      v[i] = r * r * h;
      dp[i] = v[i];
      x[i] = v[i];
    }
    sort(x + 1, x + n + 1);
    long long ans = 0;
    build(1, 1, n);
    for (int i = 1; i <= n; i++) {
      int cur = lower_bound(x + 1, x + n + 1, v[i]) - x;
      dp[i] = max(dp[i], query(1, 1, cur - 1) + v[i]);
      update(1, cur, dp[i]);
      ans = max(ans, dp[i]);
    }
    printf("%.15f\n", ans * PI);
  }
  return 0;
}
