#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100010;
long long r[MAXN];
long long h[MAXN];
int v[MAXN];
long long t[4 * MAXN];
double pi = (double)3.14159265358979323846;
long long query(int idx, int L, int R, int i, int j) {
  if (R < i || L > j) return 0;
  if (L >= i && R <= j) return t[idx];
  long long lcontent, rcontent;
  int M = (L + R) / 2;
  lcontent = query(2 * idx, L, M, i, j);
  rcontent = query(2 * idx + 1, M + 1, R, i, j);
  return max(rcontent, lcontent);
}
void update(int idx, int L, int R, int x, long long vx) {
  if (R < x || L > x) return;
  if (L == R) {
    t[idx] = vx;
    return;
  }
  int M = (L + R) / 2;
  update(2 * idx, L, M, x, vx);
  update(2 * idx + 1, M + 1, R, x, vx);
  t[idx] = max(t[2 * idx], t[2 * idx + 1]);
}
long long vid[MAXN];
int sz;
int getidx(long long vol) { return lower_bound(vid, vid + sz, vol) - vid; }
int main() {
  int n;
  scanf(" %d", &(n));
  for (int i = 0; i < (n); ++i) {
    scanf(" %lld %lld", &r[i], &h[i]);
    vid[i] = r[i] * r[i] * h[i];
  }
  sort(vid, vid + n);
  sz = unique(vid, vid + n) - vid;
  for (int i = 0; i < (n); ++i) v[i] = i;
  long long ans = 0;
  for (int i = n - 1; i >= 0; --i) {
    int idx = i;
    long long auxans = r[idx] * r[idx] * h[idx];
    int weightid = getidx(auxans);
    long long maxval = query(1, 0, sz - 1, weightid + 1, sz - 1);
    auxans += maxval;
    ans = max(ans, auxans);
    update(1, 0, sz - 1, weightid, auxans);
  }
  printf("%.12lf\n", pi * ans);
  return 0;
}
