#include <bits/stdc++.h>
using namespace std;
const long long int INF = 98769876987698889LL;
const int MOD = 1e9 + 7;
const int dx8[] = {1, 1, 0, -1, -1, -1, 0, 1};
const int dy8[] = {0, 1, 1, 1, 0, -1, -1, -1};
const int dx4[] = {0, 0, 1, -1};
const int dy4[] = {1, -1, 0, 0};
const int N = 1e5 + 5;
const int SN = 4e5;
int n;
pair<long long int, int> volume[N];
long long int tree[SN];
int cmp(pair<long long int, int> x, pair<long long int, int> y) {
  if (x.first < y.first) return 1;
  if (x.first == y.first) {
    return y.second < x.second;
  }
  return 0;
}
long long int ans = 0;
long long int query(int idx, int l, int r, int ql, int qr) {
  if (l > r or l > qr or r < ql) return 0;
  if (l >= ql and r <= qr) return tree[idx];
  int mid = (l + r) >> 1;
  return max((query(idx * 2, l, mid, ql, qr)),
             (query(idx * 2 + 1, mid + 1, r, ql, qr)));
}
void update(int idx, int l, int r, int ql, int qr, long long int val) {
  if (l > r or l > qr or r < ql) return;
  if (l >= ql and r <= qr) {
    tree[idx] = val;
    return;
  }
  int mid = (l + r) >> 1;
  update(idx * 2, l, mid, ql, qr, val);
  update(idx + idx + 1, mid + 1, r, ql, qr, val);
  tree[idx] = max(tree[idx + idx], tree[idx + idx + 1]);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    int x, y;
    cin >> x >> y;
    volume[i].first = (x * 1LL * x * y);
    volume[i].second = i;
  }
  sort(volume + 1, volume + 1 + n, cmp);
  for (int i = 1; i <= n; i++) {
    long long int get =
        query(1, 1, n, 1, volume[i].second - 1) + volume[i].first;
    ans = max(ans, get);
    update(1, 1, n, volume[i].second, volume[i].second, get);
  }
  double pi = acos(-1);
  printf("%.9lf", ans * 1.0 * pi);
}
