#include <bits/stdc++.h>
using namespace std;
const int N = (int)1e5 + 5;
int n;
pair<long long, int> t[N];
long long tree[N], dp[N], v[N];
set<long long> st;
map<long long, int> rnk;
void update(int idx, long long val, int st, int en, int root) {
  if (idx < st || idx > en) return;
  if (st == en) {
    tree[root] = max(tree[root], val);
    return;
  }
  int mid = (st + en) >> 1;
  update(idx, val, st, mid, root * 2);
  update(idx, val, mid + 1, en, root * 2 + 1);
  tree[root] = max(tree[root * 2], tree[root * 2 + 1]);
}
long long query(int L, int R, int st, int en, int root) {
  if (L > en || R < st) return 0;
  if (st >= L && en <= R) return tree[root];
  int mid = (st + en) >> 1;
  return max(query(L, R, st, mid, root * 2),
             query(L, R, mid + 1, en, root * 2 + 1));
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    int h, r;
    scanf("%d %d", &r, &h);
    v[i] = 1LL * r * r * h;
    st.insert(v[i]);
  }
  int r = 0;
  for (auto it : st) rnk[it] = r++;
  for (int i = 0; i < n; i++) {
    dp[i] = v[i];
    long long best = query(0, rnk[v[i]] - 1, 0, r - 1, 1);
    dp[i] += best;
    update(rnk[v[i]], dp[i], 0, r - 1, 1);
  }
  long long ret = 0;
  for (int i = 0; i < n; i++) ret = max(ret, dp[i]);
  cout << fixed << setprecision(12) << acos(-1) * ret << '\n';
}
