#include <bits/stdc++.h>
const double PI = 3.1415926535897932384626433832795;
using namespace std;
long long mod = 1e9 + 7;
long long tree[4 * 100005];
long long V[100005], RANK[100005], A[100005];
void update(int p, int l, int r, int pos, long long val) {
  if (pos < l || pos > r || l > r) return;
  if (l == r) {
    tree[p] = val;
    return;
  }
  int mid = (l + r) / 2;
  update(2 * p, l, mid, pos, val);
  update(2 * p + 1, mid + 1, r, pos, val);
  tree[p] = max(tree[2 * p], tree[2 * p + 1]);
}
long long query(int p, int l, int r, int L, int R) {
  if (l > R || r < L || l > r) return 0;
  if (l >= L && r <= R) return tree[p];
  int mid = (l + r) / 2;
  return max(query(2 * p, l, mid, L, R), query(2 * p + 1, mid + 1, r, L, R));
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.precision(12);
  cout << fixed;
  long long r, v, h, ans = 0;
  int n;
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> r >> h;
    V[i] = r * r * h;
    A[i] = V[i];
    ans = max(ans, V[i]);
  }
  sort(A, A + n + 1);
  for (int i = 1; i <= n; ++i) {
    int idx = lower_bound(A, A + n + 1, V[i]) - A;
    RANK[i] = idx;
  }
  long long q, val;
  for (int i = 1; i <= n; ++i) {
    if (RANK[i] > 1) {
      q = query(1, 1, n, 1, RANK[i] - 1);
      val = q + V[i];
      ans = max(ans, val);
      update(1, 1, n, RANK[i], val);
    } else {
      update(1, 1, n, 1, V[i]);
    }
  }
  cout << PI * ans << '\n';
  return 0;
}
