#include <bits/stdc++.h>
using namespace std;
void debug(vector<long long> v) {
  for (int i = 0; i < v.size(); i++) cout << v[i] << " ";
  cout << "\n";
}
class segtree {
 public:
  long long size;
  const long long inf = 0x7fffffff;
  long long MAX;
  vector<long long> tree;
  vector<long long> lazy;
  vector<long long> arr;
  segtree(long long n) {
    size = n;
    MAX = 4 * n;
    tree = vector<long long>(MAX, 0);
    lazy = tree;
    arr = vector<long long>(size);
  }
  void build_tree(long long node, long long a, long long b) {
    if (a > b) return;
    if (a == b) {
      tree[node] = arr[a];
      return;
    }
    build_tree(node * 2, a, (a + b) / 2);
    build_tree(node * 2 + 1, 1 + (a + b) / 2, b);
    tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
  }
  void update_tree(long long node, long long a, long long b, long long i,
                   long long j, long long value) {
    if (a > b || a > j || b < i) return;
    if (a == b) {
      tree[node] = value;
      return;
    }
    update_tree(node * 2, a, (a + b) / 2, i, j, value);
    update_tree(1 + node * 2, 1 + (a + b) / 2, b, i, j, value);
    tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
  }
  long long query_tree(long long node, long long a, long long b, long long i,
                       long long j) {
    if (a > b || a > j || b < i) return -inf;
    if (a >= i && b <= j) return tree[node];
    long long q1 = query_tree(node * 2, a, (a + b) / 2, i, j);
    long long q2 = query_tree(1 + node * 2, 1 + (a + b) / 2, b, i, j);
    long long res = max(q1, q2);
    return res;
  }
  void update(long long st, long long end, long long value) {
    update_tree(1, 0, size - 1, st, end, value);
  }
  void update(long long point, long long value) {
    update_tree(1, 0, size - 1, point, point, value);
  }
  long long query(long long st, long long end) {
    return query_tree(1, 0, size - 1, st, end);
  }
  void build() { build_tree(1, 0, size - 1); }
};
long long arr[100010];
long long arr2[100010];
long long val[100010];
const double pi = 2 * acos(0);
int main() {
  long long t, z, i, j, k, n, m, p, q, r, s;
  double ans;
  t = 1;
  for (z = 1; z <= t; z++) {
    scanf("%lld", &n);
    for (i = 0; i < n; i++) {
      scanf("%lld%lld", &p, &q);
      arr2[i] = arr[i] = p * p * q;
    }
    sort(arr2, arr2 + n);
    segtree segt(100010);
    ans = 0;
    for (i = 0; i < n; i++) {
      long long x = lower_bound(arr2, arr2 + n, arr[i]) - arr2;
      x--;
      p = 0;
      if (x >= 0) p = segt.query(0, x);
      segt.update(x + 1, arr[i] + p);
    }
    ans = pi * segt.query(0, n - 1);
    printf("%.10lf\n", ans);
  }
  return 0;
}
