#include <bits/stdc++.h>
using namespace std;
long long r[100009], h[100009];
set<long long> S;
vector<long long> v;
long long dp[100009];
long long st[4 * 100009];
long double PIE = 3.1415926535897;
long long query(int s, int e, int idx, int l, int r) {
  if ((l > e) || (s > r) || (l > r) || (s > e)) {
    return 0LL;
  }
  if ((l <= s) && (r >= e)) {
    return st[idx];
  }
  int m = (s + e) / 2;
  return max(query(s, m, 2 * idx + 1, l, r),
             query(m + 1, e, 2 * idx + 2, l, r));
}
void update(int s, int e, int idx, int pos, long long val) {
  if (s > pos || (e < pos)) {
    return;
  }
  if ((s == e) && (s == pos)) {
    st[idx] = val;
    return;
  }
  int m = (s + e) / 2;
  update(s, m, 2 * idx + 1, pos, val);
  update(m + 1, e, 2 * idx + 2, pos, val);
  st[idx] = max(st[2 * idx + 1], st[2 * idx + 2]);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> r[i] >> h[i];
    S.insert(r[i] * r[i] * h[i]);
  }
  for (set<long long>::iterator it = S.begin(); it != S.end(); it++) {
    v.push_back(*it);
  }
  int c = (int)v.size();
  long long ans = 0;
  for (int i = 0; i < n; i++) {
    int l = lower_bound(v.begin(), v.end(), r[i] * r[i] * h[i]) - v.begin();
    l--;
    long long x = query(0, c - 1, 0, 0, l);
    dp[i] = x + (r[i] * r[i] * h[i]);
    ans = max(ans, dp[i]);
    update(0, c - 1, 0, l + 1, dp[i]);
  }
  long double res = (long double)ans * PIE;
  cout << fixed << setprecision(13);
  cout << res << endl;
}
