#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const double eps = 1e-15;
double PI = 3.14159265359;
const int N = 100001;
pair<double, int> r[N];
double rev[N];
int comp[N];
int n, rr, h, pntr;
double tree[N * 4];
double query(int node, int l, int r, int ll, int rr) {
  if (l > rr || r < ll) return 0;
  if (l >= ll && r <= rr) return tree[node];
  int mid = (l + r) >> 1;
  return max(query(node << 1, l, mid, ll, rr),
             query(node << 1 | 1, mid + 1, r, ll, rr));
}
void insert(int node, int l, int r, int idx) {
  if (l == r) {
    tree[node] = rev[l] + query(1, 1, pntr, 1, l - 1);
    return;
  }
  int mid = (l + r) >> 1;
  if (idx <= mid)
    insert(node << 1, l, mid, idx);
  else
    insert(node << 1 | 1, mid + 1, r, idx);
  tree[node] = max(tree[node << 1], tree[node << 1 | 1]);
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> rr >> h;
    r[i].first = PI * rr * rr * h;
    r[i].second = i;
  }
  sort(r + 1, r + n + 1);
  comp[r[1].second] = 1;
  rev[1] = r[1].first;
  pntr = 1;
  for (int i = 2; i <= n; i++) {
    if (r[i].first - r[i - 1].first > eps) {
      pntr++;
      rev[pntr] = r[i].first;
    }
    comp[r[i].second] = pntr;
  }
  memset(tree, 0, sizeof(tree));
  for (int i = 1; i <= n; i++) {
    insert(1, 1, pntr, comp[i]);
  }
  cout << fixed << setprecision(9) << query(1, 1, pntr, 1, pntr);
}
