#include <bits/stdc++.h>
using namespace std;
vector<double> seg;
void constructSt(int n) {
  int x = log2(n) + 1;
  int size = 2 * pow(2, x) - 1;
  seg.resize(size);
}
double update(int idx, double val, int st, int end, int pos) {
  double t1, t2;
  if (end < idx || st > idx) return seg[pos];
  if (st == end && st == idx) {
    seg[pos] = val;
    return seg[pos];
  }
  int mid = (st + end) / 2;
  t1 = update(idx, val, st, mid, 2 * pos + 1);
  t2 = update(idx, val, mid + 1, end, 2 * pos + 2);
  seg[pos] = max(t1, t2);
  return seg[pos];
}
double getLarge(int st, int end, int l, int r, int pos) {
  if (l > r) return 0;
  if (st > r || end < l) return 0;
  if (st >= l && end <= r) return seg[pos];
  int mid = (st + end) / 2;
  return max(getLarge(st, mid, l, r, 2 * pos + 1),
             getLarge(mid + 1, end, l, r, 2 * pos + 2));
}
double pi = 3.14159265359;
int main() {
  double n;
  cin >> n;
  vector<pair<double, double> > arr(n), temp;
  for (int i = 0; i < n; i++) {
    double r, h;
    scanf("%lf%lf", &r, &h);
    arr[i].first = (pi * r * r * h);
  }
  temp = arr;
  sort(temp.begin(), temp.end());
  for (int i = 0; i < n;) {
    int j = i;
    while (j < n && temp[j].first == temp[i].first) {
      temp[i].second = j;
      i++;
    }
  }
  double sum = 0;
  for (int i = 0; i < n; i++) {
    int it = lower_bound(temp.begin(), temp.end(), arr[i]) - temp.begin();
    arr[i].second = temp[it].second;
  }
  constructSt(n);
  for (int i = 0; i < n; i++) {
    double sum = getLarge(0, n - 1, 0, arr[i].second - 1, 0);
    update(arr[i].second, arr[i].first + sum, 0, n - 1, 0);
  }
  cout << setprecision(20) << getLarge(0, n - 1, 0, n - 1, 0);
}
