#include <bits/stdc++.h>
using namespace std;
long long t[4 * 100100], dp[100100], a[100100], b[100100];
long long K = 1, n, m;
void build() {
  while (K < m + 2) K <<= 1;
}
long long query(long long l, long long r) {
  long long ans = 0;
  for (l += K - 1, r += K + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
    if (~l ^ 1) ans = ((ans) >= (t[l + 1]) ? (ans) : (t[l + 1]));
    if (r ^ 1) ans = ((ans) >= (t[r - 1]) ? (ans) : (t[r - 1]));
  }
  return ans;
}
void update(long long id, long long v) {
  for (t[id += K] = v, id >>= 1; id >= 1; id >>= 1)
    t[id] = max(t[id << 1 | 1], t[id << 1]);
}
long long get_id(long long x) {
  long long l = 1, r = m, mid;
  while (l < r) {
    mid = (l + r + 1) >> 1;
    if (b[mid] > x)
      r = mid - 1;
    else
      l = mid;
  }
  return l;
}
void unique() {
  m = 1;
  for (long long i = 2; i <= n; i++)
    if (b[i] != b[m]) b[++m] = b[i];
}
void input() {
  scanf("%I64d", &n);
  for (long long i = 1, r, h; i <= n; i++) {
    scanf("%I64d%I64d", &r, &h);
    a[i] = b[i] = r * r * h;
  }
  return;
}
void init() {
  sort(b + 1, b + n + 1);
  unique();
  build();
  return;
}
void work() {
  for (long long i = 1; i <= n; i++) {
    long long id = get_id(a[i]);
    dp[i] = query(1, id - 1) + a[i];
    update(id, dp[i]);
  }
  return;
}
void output() {
  printf("%.15lf", query(1, m) * M_PI);
  return;
}
int main() {
  input();
  init();
  work();
  output();
  return 0;
}
