#include <bits/stdc++.h>
using namespace std;
vector<long long> st;
int pot = 1;
vector<pair<long long, int> > v_aux;
void st_change(int idx, long long dp_val) {
  int node = pot + idx;
  st[node] = dp_val;
  node /= 2;
  while (node != 0) {
    st[node] = max(st[2 * node], st[2 * node + 1]);
    node /= 2;
  }
}
long long st_query(int node, int l, int r, int L, int R) {
  if (r < L || l > R)
    return 0ll;
  else if (L <= l && r <= R)
    return st[node];
  else {
    long long q1 = st_query(2 * node, l, (l + r) / 2, L, R);
    long long q2 = st_query(2 * node + 1, (l + r) / 2 + 1, r, L, R);
    return max(q1, q2);
  }
}
long long query(int i) {
  if (v_aux[0].first == v_aux[i].first)
    return 0ll;
  else {
    int l = 0, m, r = i;
    while (l != r) {
      m = (l + r + 1) / 2;
      if (v_aux[m].first < v_aux[i].first)
        l = m;
      else
        r = m - 1;
    }
    return st_query(1, 0, pot - 1, 0, l);
  }
}
int main() {
  int n;
  scanf("%d", &n);
  long long r, h;
  vector<long long> v(n);
  vector<int> sigma(n);
  v_aux.resize(n);
  for (int i = 0; i < n; i++) {
    scanf("%lld %lld", &r, &h);
    v[i] = r * r * h;
    v_aux[i] = pair<long long, int>(v[i], i);
  }
  sort(v_aux.begin(), v_aux.end());
  for (int i = 0; i < n; i++) sigma[v_aux[i].second] = i;
  while (pot < n) pot *= 2;
  st = vector<long long>(2 * pot + 1, 0ll);
  for (int i = 0; i < n; i++) {
    st_change(sigma[i], v[i] + query(sigma[i]));
  }
  printf("%.13f\n", ((double)st_query(1, 0, pot - 1, 0, pot - 1)) *
                        3.141592653589793238462643383279502884197169399375);
}
