#include <bits/stdc++.h>
using namespace std;
vector<pair<long long, long long> > v1;
long long tree[400005];
bool comp(pair<long long, long long> a, pair<long long, long long> b) {
  if (a.first == b.first) {
    return a.second > b.second;
  }
  return a.first < b.first;
}
void update(long long low, long long high, long long index, long long val,
            long long id) {
  if (low > high) return;
  if (low == high) {
    tree[id] = val;
    return;
  }
  long long mid = (low + high) / 2;
  if (index >= low && index <= mid)
    update(low, mid, index, val, 2 * id + 1);
  else
    update(mid + 1, high, index, val, 2 * id + 2);
  tree[id] = max(tree[2 * id + 1], tree[2 * id + 2]);
  return;
}
long long query(long long low, long long high, long long l, long long r,
                long long id) {
  if (low > high || low > r || high < l || l > r) return 0;
  if (low >= l && high <= r) {
    return tree[id];
  }
  long long mid = (low + high) / 2;
  if (mid >= r)
    return query(low, mid, l, r, 2 * id + 1);
  else if (low > mid)
    return query(mid + 1, high, l, r, 2 * id + 2);
  else {
    long long temp1 = query(low, mid, l, r, 2 * id + 1);
    long long temp2 = query(mid + 1, high, l, r, 2 * id + 2);
    return max(temp1, temp2);
  }
}
int main() {
  std::ios::sync_with_stdio(false);
  long long n, r, h;
  cin >> n;
  for (long long i = (long long)(0); i <= (long long)(n - 1); i++) {
    cin >> r >> h;
    v1.push_back(make_pair(r * r * h, i));
  }
  sort(v1.begin(), v1.end(), comp);
  long long ans = 0;
  for (long long i = (long long)(0); i <= (long long)(n - 1); i++) {
    long long id = v1[i].second;
    long long temp = query(0, n - 1, 0, id - 1, 0);
    temp += v1[i].first;
    update(0, n - 1, id, temp, 0);
    ans = max(ans, temp);
  }
  cout << fixed << setprecision(15) << acos(-1) * ans << endl;
  return 0;
}
