#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T readin(T &rt) {
  char c;
  T tmp = 0, x = 1;
  c = getchar();
  while (c > '9' || c < '0') {
    if (c == '-') x = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    tmp = tmp * 10 + c - '0';
    c = getchar();
  }
  return rt = tmp * x;
}
const int maxN = 100000 + 10;
const double Pi = acos(-1.0);
int n, r[maxN], h[maxN];
long long V[maxN];
long long dp[maxN];
map<long long, int> rfl;
pair<long long, int> ck[maxN];
long long maxv[maxN << 2], adv[maxN << 2];
void maintain(int o) {
  maxv[o] = max(maxv[(o << 1)], maxv[(o << 1 | 1)]);
  if (adv[o] != 0) maxv[o] += adv[o];
}
void pushdown(int o, int l, int r) {
  if (adv[o] != 0.0) {
    adv[(o << 1)] += adv[o];
    adv[(o << 1 | 1)] += adv[o];
    maxv[(o << 1)] += adv[o];
    maxv[(o << 1 | 1)] += adv[o];
    adv[o] = 0;
  }
}
void Uadd(int o, int l, int r, int ql, int qr, long long val) {
  if (ql > r || qr < l) return;
  if (ql <= l && r <= qr) {
    maxv[o] += val;
    return;
  }
  int mid = (l + r) >> 1;
  pushdown(o, l, r);
  if (ql <= mid) Uadd((o << 1), l, mid, ql, qr, val);
  if (qr > mid) Uadd((o << 1 | 1), mid + 1, r, ql, qr, val);
  maintain(o);
}
long long Qmax(int o, int l, int r, int ql, int qr) {
  if (ql > r || qr < l) return 0;
  if (ql <= l && r <= qr) return maxv[o];
  int mid = (l + r) >> 1;
  pushdown(o, l, r);
  long long ret = 0;
  if (ql <= mid) ret = max(ret, Qmax((o << 1), l, mid, ql, qr));
  if (qr > mid) ret = max(ret, Qmax((o << 1 | 1), mid + 1, r, ql, qr));
  return ret;
}
long long bmax[maxN];
inline int lowbit(int x) { return x & (-x); }
long long getmax(int pos) {
  long long ret = 0;
  while (pos > 0) {
    ret = max(ret, bmax[pos]);
    pos -= lowbit(pos);
  }
  return ret;
}
void upd(int pos, long long val) {
  while (pos <= n) {
    bmax[pos] = max(bmax[pos], val);
    pos += lowbit(pos);
  }
}
int main() {
  readin(n);
  for (int i = 1; i <= n; i++) readin(r[i]), readin(h[i]);
  for (int i = 1; i <= n; i++) {
    V[i] = 1ll * r[i] * r[i] * h[i];
    ck[i] = make_pair(V[i], i);
  }
  sort(ck + 1, ck + 1 + n);
  int sz = unique(ck + 1, ck + 1 + n) - (ck + 1);
  for (int i = 1; i <= sz; i++) rfl[ck[i].first] = i;
  long long ans = 0.0;
  for (int i = 1; i <= n; i++) {
    dp[i] = getmax(rfl[V[i]] - 1) + V[i];
    ans = max(ans, dp[i]);
    upd(rfl[V[i]], dp[i]);
  }
  printf("%.7lf\n", 1.0 * ans * Pi);
  return 0;
}
